Framework启动:
WifiManager::setWifiEnabled
->WifiServiceImpl::WifiManager::setWifiEnabled
->WifiController::StaDisabledState::processMessage(CMD_WIFI_TOGGLED)
->WifiController::StaEnabledState::Enter()
->ActiveModeWarden::enterClientMode()
->ActiveModeWarden::ModeStateMachine::checkForAndHandleModeChange(CMD_START_CLIENT_MODE)
->ClientModeActiveState::Enter()
->ClientModeManager::Start()
->ClientModeManager::ClientModeStateMachine::processMessage(CMD_START)
->WifiNative::setupInterfaceForClientInConnectivityManager
该文件是操作wifi的入口。WifiManager::setWIfiEnabled(true)打开wifi开关。调用该方法需要申请android.Manifest.permission#CHANGE_WIFI_STATE权限
调到WifiServiceImpl.java(他的对象就是mservice),调WifiServiceImpl.java中的setWifiEnabled()方法。进行一些权限和接口调用限制的审查。审查过了之后,发送CMD_WIFI_TOGGLED消息出去
在WifiController.java中接收到CMD_WIFI_TOGGLED消息后,进行下一步处理。先说一下WifiController这个类。
WiFiController 在WiFiServiceImpl.java中创建
由WiFiInjector对象得到的
看一下WiFiInjector里面的方法:
接着来看看WifiController.java由这个类,里面维护了一套状态机:
进入WifiController:
在StaDisabledState中做的事情:
状态走到 StaEnabledState中:
进入到ClientMode,其初始状态是WiFiDisabledState:
状态再一次切换到 ClientmodeActiveState:
进入到ClientModeManager.java:
因为ClientModeManager集成子ActiveModeManager。
08-24 22:51:07.767474 941 1651 D WifiClientModeManager: entering IdleState
上面的enter方法调用的start方法将用于发送一个CMD_START消息出去。
ClientModeManager中处理CMD_START消息的地方。首先,发送了一个广播用于通知监听者wifi开关状态的变化。然后调用了WifiNative的setUpInterfaceForClientInConnectivityMode(InterfaceCallback)方法,同时利用该方法注册了一个接口,接收底层返回来的interface状态变化。setUpInterfaceForClientInConnectivityMode()的返回值表示interface的名字,例如wlan0。
先看一下这个回调,mWifiNativeInterfaceCallback回调会接收到interface的销毁、up和down的状态通知
再接着看一下WifiNative中的setUpInterfaceForClientInConnectivityMode()方法,这个方法可干了不少事情。启动vendor hal、supplicant:
接下来看看HAL的启动
HAL启动承接framework启动:
StartHal()
->StartVendorHal()
->HalDeviceManager::startWifi()
HIDL -> Native:
->wifi::startInternal()
->initializeModeControllerAndLegacyHal
->ModeController::LoadDriver()
->wifi_hal_common::wifi_load_driver()
->insmod(wlan.ko)
->wifi_legacy_hal::initialize()
->initHalFuncTableWithStubs()
->init_wifi_vendor_hal_func_table()
—>startHal()将启动hal层装载驱动
此时调到(HIDL)WiFi.cpp的start():
调用initialoize方法:
WifiLegacyHal initialize
wifi_error WifiLegacyHal::initialize() {
LOG(DEBUG) << “Initialize legacy HAL”;
// TODO: Add back the HAL Tool if we need to. All we need from the HAL tool
// for now is this function call which we can directly call.
if (!initHalFuncTableWithStubs(&global_func_table_)) { //wifi_legacy_hal_stubs.cpp加载函数列表
LOG(ERROR)
<< “Failed to initialize legacy hal function table with stubs”;
return WIFI_ERROR_UNKNOWN;
}
wifi_error status = init_wifi_vendor_hal_func_table(&global_func_table_);///hardware/qcom/wlan/qcwcn/wifi_hal/wifi_hal.cpp 中加载函数列表
if (status != WIFI_SUCCESS) {
LOG(ERROR) << “Failed to initialize legacy hal function table”;
}
return status;
}
IWifi.hal 驱动加载和函数映射(HIDL)
WifiService(java进程)通过IWifi.hal HIDL接口调用到C++端的Wifi.cpp
至此WiFi driver加载完成,Supplicant启动承接framework启动:驱动开启了,supplicant才有netlink连接可以建立:
StartSupplicant()
->startAndWaitForSupplicantConnection()
->StartDaemon() 启动wpa_supplicant
HIDL -> Native
->Main() -> 解析参数
->wpa_supplicant_init()
->eap_register_methods() 注册eap状态机
->eloop_init() 创建loop,用于实现supplicant中的异步化
->wpas_notify_supplicant_initialized() 初始化与上层对应的喊出表,用于返回底层信息
->wpa_supplicant_add_iface()
->wpa_supplicant_init_iface()
->wpas_init_driver()
->wpa_drv_init()
->wpa_driver_nl80211_init() 初始化netlink连接
->wpa_supplicant_driver_init()配置mac,扫描参数,supplicant状态机初始化
->wpas_wps_init() wps初始化,配置相关认证方法
->wpa_supplicant_init_eapol() 初始化eap认证参数
->wifi_display_init() 开启 wifidisplay功能