Android Q WiFi启动流程

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里面的方法:
但是是由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消息出去:上面的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功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值