<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                這篇主要對hostapd這個程序做一個整體的梳理,自己也覺得前面說的都好亂,盡是一些代碼的分析,過于細節了。 關于EAP狀態機的轉化,這里就不多說了,[點擊打開鏈接](http://download.csdn.net/detail/lee244868149/8288875) 這里可以下載原文檔,知道的是自己不會比原文檔寫的還好的,所以就放棄了介紹狀態機了。 先理解一下 struct hapd_interfaces interfaces 這個結構體對象, 這個結構體里面封裝的是一個count成員和一個 struct hostapd_iface? **iface成員: ~~~ struct hapd_interfaces interfaces { size_t? count; struct hostapd_iface? **iface;?? } ~~~ 所以interfaces其實是對接口的封裝,也許有多張無線網卡,那么就會有多個無線接口(注意區分空中接口),那么hostapd程序的interfaces就會封裝多個 iface對象,并用count計數。比如我現在hostapd需要用兩張網卡來創建兩個接口,一個是2.4G、一個是5G的網絡,那么調用hostapd 傳入參數時,就需要傳入兩個配置文件,count將會獲得值2,并且會創建兩個結構體指針 iface[0]和iface[1] (? struct hostapd_iface? *iface[ ] ),用來分別存放兩張網卡的各自操作和信息等。?? 下面只分析一張網卡(注意下面說的網卡都是指無線網卡)的整體過程,因為不同無線網卡的區別主要體現在驅動方面,所以hostapd程序來說,不同網卡之間的處理過程都差不多的(比較數據包格式和通信協議沒差啊)。 main函數開始的for循環就不在重復了,主要注意的是-B選項和-e選項指定了 程序以后臺進程運行和指定了entropy文件罷了。 下面將以3條線開始整理,分別是 hostapd_global_init()??? hostapd_interfaces_init()?? hostapd_global_run() , 關于出錯處理時,需要注意一下這個進程的重新加載,判斷reloading以后調用execvp()函數實現重載。 ### 一、 hostapd_global_init()?? 實現安全方法的注冊、eloop初始化、entropy文件的讀取和處理、退出中斷的注冊 1. 注冊方法 eap_server_register_methods() 首先調用各種方法對應的注冊函數,定義struct eap_method *eap 對像,給這個對象申請空間后,給eap對象中的操作函數指針賦值,最后使用eap_server_method_register()將本方法添加進 method的鏈表中。 2.eloop初始化 eloop_init() 將struct eloop_data? eloop對象清空后,將eloop.timeout添加到雙鏈表中,最后注冊一個SIGSAVE中斷,以在特定情況下終止進程。 3.entropy文件的讀取和處理 random_init() 4.退出中斷的注冊? eloop_register_signal_terminate() 這里主要完成eloop.teminate = 1 ,當信號產生時, 這個變量置1,能夠讓后面的while循環退出,終止程序,第二個參數interfaces主要用來指定這個信號發送給哪張無線網卡(當前無線網卡)。 ### 二、 hostapd_interfaces_init()??? 這個函數很關鍵,接下來慢慢細說! struct hostapd_iface *iface? 這個對象封裝了對接口操作的各種函數以及對接口描述的各種參數。 iface = hostapd_init (config_fname);? 注意著句話,函數的返回值賦值給了iface,而傳入的參數是config_fname(配置文件路徑及名稱),我們可以猜想這句話就是要完成將配置文件中的內容讀取出來,并存放到iface對象中。 1. 根據配置文件配置接口? hostapd_init()? 為了具體一點,現在將代碼列出來: ![](https://box.kancloud.cn/2016-04-15_57108d8e0217a.jpg) 首先定義三個結構體對象,分別用來存放接口信息、接口配置信息和報文協議等信息——hostapd_iface、 hostapd_conf、 hostapd_data hapd_iface->reload_config = hostapd_reload_config? 需要刷新或者修改了配置文件需要重新加載的時候,調用這個函數 hapd_iface->config_read_cb = hostapd_config_read 先加載默認的配置,然后加載配置文件中的配置,存放到conf對象中 hapd_iface-> config_fname? 存放配置文件的路徑信息 hapd_iface->ctrl_iface_init =hostapd_ctrl_iface_init?? 這個函數很重要,主要對初始化套接字通信,包括調用socket和bind函數eloop_register_read_sock,實現套接字通信,這里調用了hostapd_ctrl_iface_receive(),里面有receivefrom和sendto函數實現通信。 hapd_iface->conf = conf 存放讀取的配置信息 hapd->msg_ctx = hapd?? 這里存放各種要發送的信息,比如報文信息、協議信息等, 因為hapd是struct hostapd_data 結構體對象 接下來對bss進行初始化 2.驅動程序初始化? hostapd_driver_init() 首先對啟動可能用到的各種params進行初始化賦值,然后用hapd->driver_priv = hapd->driver-> hostapd_init( hapd, &params) 語句,用params中的參數對驅動進行初始化。 那么hostapd_init調用的是哪里的函數呢?這個路徑的指定在初始化iface時,在iface->BSS[0] 中,hostapd_init將會調用 src/ driver / dirver_madwifi.c 中的 madwifi_init函數,具體驅動應用程序做了什么,就不拓展了。 hapd->driver->get_capa 需要留意一下。 3.設置接口配置 hostapd_setup_interface()????? "setup_interface" 使用的hostapd_data對象還是來自于 iface->bss[0]? ,首先使用hostapd_validate_bssid_configuration驗證iface中的BSSID是否可用,調用hosta_get_hw_features獲取硬件信息,最后調用hostapd_setup_interface_complete返回結果。 其實在上面那個函數中,是做了好多設置才返回的,比如通道、頻率、硬件模式(hw_mode)、傳輸速率、RTS、幀、熱拔插、WPS等等。 ### 三、 hostapd_global_run() 1. tncs_global_init 初始化 2.os_daemonize()讓本進行以守護進程運行 3.eloop_run() 將申請的標準輸入、輸出、出錯文件描述符集,用select函數進行監聽,調用eloop_process_pending_signals處理即將到來的中斷信號,接下來進行超時處理。 還有關于驅動那一塊還沒有整理,先留著吧,說不定哪一天興趣來了在看看,花這么多時間才弄清楚這個小小的hostapd,感覺有點不值,有時候問自己為什么要花時間去弄明白人家已經做好的東西呢,直接拿過來用不就好了嗎,沒辦法,也許嵌入式開發就是這樣吧,也許是性格使然。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看