天天看點

android 6.0架構下wpa_supplicant分析 1. 系統架構2. WifiService和wpa_supplicant啟動流程3. wpa_supplicant的設計文檔

      本文根據網上的資料,自己搜集整理。基于android6.0的版本,重新定位了檔案的位置,以及調用情況

1. 系統架構

       Android WiFi系統引入了wpa_supplicant,它的整個WiFi系統以wpa_supplicant為核心來定義上層使用者接口和下層驅動接口。整個WiFi系統架構如下圖所示:

android 6.0架構下wpa_supplicant分析 1. 系統架構2. WifiService和wpa_supplicant啟動流程3. wpa_supplicant的設計文檔

   一切盡在上圖中,下面将對每部分進行詳細分析。

1.1 WifiService

     由SystemServer啟動的時候生成的ConnecttivityService建立,負責啟動關閉wpa_supplicant,啟動和關閉WifiMonitor線程,把指令下發給wpa_supplicant以及更新WIFI的狀态。

     處理其它子產品通過IWifiManager接口發送過來的遠端WiFi操作。

1.2 WifiMonitor

    負責從wpa_supplicant接收事件通知。

1.3 wpa_supplicant

  1) 讀取配置檔案

  2) 初始化配置參數,驅動函數

  3) 讓驅動scan目前所有的bssid

  4) 檢查掃描的參數是否和使用者設定的相符

  5) 如果相符,通知驅動進行權限和認證操作

  6) 連上AP

1.4 Wifi驅動子產品

    廠商提供的source,主要進行load firware和kernel的wireless進行通信

1.5 Wifi電源管理子產品

    主要控制硬體的GPIO和上下電,讓CPU和Wifi模組之間通過sdio接口或USB接口通信

1.6 Wifi工作步驟

  1) Wifi啟動

  2) 開始掃描

  3) 顯示掃描的AP

  4) 配置AP

  5) 連接配接AP

  6) 擷取IP位址

  7) 上網

1.7 Wifi子產品代碼

   1) Wifi Settings應用程式

       packages/apps/Settings/src/com/android/settings/wifi

       frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi

   2) Wifi Framework

       frameworks/base/wifi/java/android/net/wifi(WifiManager)

       frameworks/base/core/java/android/net

       frameworks/base/core/java/android/app(SystemServiceRegistry)

       frameworks/base/services/java/com/android/server(SystemServer)

       frameworks/base/services/core/java/com/android/server(SystemServiceManager)

       frameworks/opt/net/wifi/service/java/com/android/server/wifi(WifiService/WifiServiceImpl/WifiMonitor/

WifiStateMachine/WifiNative)

   3) Wifi JNI

       frameworks/opt/net/wifi/service/jni/com_android_server_wifi_WifiNative.cpp

   4) Wifi Hardware (wifi管理庫)

       hardware/libhardware_legacy/wifi/wifi.c

   5) wpa_supplicant(wifi  tool)

       external/wpa_supplicant8

       (1) wpa_client (生成庫libwpaclient.so)

            external/wpa_supplicant_8/wpa_supplicant/src/common/wpa_ctrl.c

       (2) wpa_server (生成守護程序wpa_supplicant)

            external/wpa_supplicant_8/wpa_supplicant/main.c

   6) Wifi kernel

       net/wireless     drivers/wlan_xxx       arch/arm/mach-xxx/wlan_pm.c

2. WifiService和wpa_supplicant啟動流程

     WifiService和wpa_supplicant啟動流程如下圖所示:

android 6.0架構下wpa_supplicant分析 1. 系統架構2. WifiService和wpa_supplicant啟動流程3. wpa_supplicant的設計文檔

2.1 狀态變化

• 加載wifi驅動的狀态變化流程如下:

初始狀态:mInitialState

                         |

          mDriverUnloadedState

                         |

      mWaitForP2pDisableState

                         |

mDriverLoadingState(其enter中調用WifiNative.loadDriver)

• 啟動wpa_supplicant的狀态變化如下:

   在DriverLoadedState狀态的processMessage中調用WifiNative.startSupplicant

2.2 wpa_supplicant的啟動過程

        Wpa_supplicant在系統啟動的時候,會在init.rc中建立wpa_supplicant目錄——mkdir/data/misc/wifi/wpa_supplicant

        Wpa_supplicant服務通常在/device/xxxx(廠商)/xxxx(晶片名)下面的init.xxx.rc中開啟,如mtk打開wpa_supplicant就在/device/mediatek/mt8127下面的init.mt8127.rc中,服務如下:

           service wpa_supplicant /system/bin/wpa_supplicant \

           -iwlan0 –Dnl80211 –c/data/misc/wifi/wpa_supplicant.conf

WifiService和WifiMonitor是整個子產品的核心。wifiService負責啟動和關閉wpa_supplicant,發送指令給wpa_supplicant程序。wifiMonitor負責從wpa_supplicant接收事件,它由wifiStateMachine建立。

整個流程如下:

android 6.0架構下wpa_supplicant分析 1. 系統架構2. WifiService和wpa_supplicant啟動流程3. wpa_supplicant的設計文檔
android 6.0架構下wpa_supplicant分析 1. 系統架構2. WifiService和wpa_supplicant啟動流程3. wpa_supplicant的設計文檔
android 6.0架構下wpa_supplicant分析 1. 系統架構2. WifiService和wpa_supplicant啟動流程3. wpa_supplicant的設計文檔
android 6.0架構下wpa_supplicant分析 1. 系統架構2. WifiService和wpa_supplicant啟動流程3. wpa_supplicant的設計文檔

Wifi的啟動可以分為4個大步驟:啟動、掃描、連接配接和IP配置設定

(1)Setting界面打開wifi

首先調用onSwitchChanged()函數,接着調用到mWifiManager.setWifiEnable(),進而調用到mWifiService.setWifiEnable(),到達WifiStateMachine類中進行處理。通過JNI,調用到mWifiNative.loadDriver(),最後調用到hardware層的wifi.c中wifi_load_driver()函數,實作了wifi的打開。

(2)開始掃描

android 6.0架構下wpa_supplicant分析 1. 系統架構2. WifiService和wpa_supplicant啟動流程3. wpa_supplicant的設計文檔
android 6.0架構下wpa_supplicant分析 1. 系統架構2. WifiService和wpa_supplicant啟動流程3. wpa_supplicant的設計文檔
android 6.0架構下wpa_supplicant分析 1. 系統架構2. WifiService和wpa_supplicant啟動流程3. wpa_supplicant的設計文檔
android 6.0架構下wpa_supplicant分析 1. 系統架構2. WifiService和wpa_supplicant啟動流程3. wpa_supplicant的設計文檔

(3)連接配接流程

android 6.0架構下wpa_supplicant分析 1. 系統架構2. WifiService和wpa_supplicant啟動流程3. wpa_supplicant的設計文檔
android 6.0架構下wpa_supplicant分析 1. 系統架構2. WifiService和wpa_supplicant啟動流程3. wpa_supplicant的設計文檔
android 6.0架構下wpa_supplicant分析 1. 系統架構2. WifiService和wpa_supplicant啟動流程3. wpa_supplicant的設計文檔
android 6.0架構下wpa_supplicant分析 1. 系統架構2. WifiService和wpa_supplicant啟動流程3. wpa_supplicant的設計文檔

調用onClick後,根據網絡的配置情況進行判斷。如果配置過的,直接連接配接。如果沒有配置過,則根據上面的步驟調用到WifiConfigStore中的enableNetWork()函數,重新new一個WifiConfiguration起來,完成配置過程。

(4)IP配置設定

WifiMonitor類的thread通過waitForEvent()函數一直等待接收事件消息,在收到HOST_AP_EVENT_PREFIX_STR消息後,通過handleHostApEvents()函數調用mStateMachine.sendMessage将消息AP_STA_CONNECTED_EVENT發送出去。WifiStateMachine類的processMessage()函數在接收到消息後調用sendClientsChangedBroacast()函數new一個Intent()類并廣播消息通知IntentAction有改變,進而最後完成網絡的切換。

3. wpa_supplicant的設計文檔

http://w1.fi/wpa_supplicant/wpa_supplicant-devel.pdf

參考文檔:

http://blog.csdn.net/anskya520/article/details/6912528

http://blog.csdn.net/myarrow/article/details/8129607