Android O wifi turn on -- load driver后续

1. frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiStateMachine.java

    class InitialState extends State {...        public boolean processMessage(Message message) {            logStateAndMessage(message, this);            switch (message.what) {                case CMD_START_SUPPLICANT:...                    if (!mWifiNative.enableSupplicant()) {...}

2. frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiNative.java

    public boolean enableSupplicant() {        return mWificondControl.enableSupplicant();    }

3. frameworks/opt/net/wifi/service/java/com/android/server/wifi/WificondControl.java

    public boolean enableSupplicant() {        if (mClientInterface == null) {            Log.e(TAG, "No valid wificond client interface handler");            return false;        }        try {            return mClientInterface.enableSupplicant();        } catch (RemoteException e) {            Log.e(TAG, "Failed to enable supplicant due to remote exception");        }        return false;    }

4. system/connectivity/wificond/client_interface_binder.cpp

Status ClientInterfaceBinder::enableSupplicant(bool* success) {  *success = impl_ && impl_->EnableSupplicant();  return Status::ok();}

5. system/connectivity/wificond/client_interface_impl.cpp

bool ClientInterfaceImpl::EnableSupplicant() {  return supplicant_manager_->StartSupplicant();}

6. frameworks/opt/net/wifi/libwifi_system/supplicant_manager.cpp

bool SupplicantManager::StartSupplicant() {  char supp_status[PROPERTY_VALUE_MAX] = {'\0'};  int count = 200; /* wait at most 20 seconds for completion */  const prop_info* pi;  unsigned serial = 0;  /* Check whether already running */  if (property_get(kSupplicantInitProperty, supp_status, NULL) &&      strcmp(supp_status, "running") == 0) {    return true;  }....}

 

分析:

1.WificondControl.java与wificond

2. wificond与libwifi_system

WifiCondControl.java

   public IClientInterface setupDriverForClientMode() {

        mWificond = mWifiInjector.makeWificond();
        if (mWificond == null) {
            Log.e(TAG, "Failed to get reference to wificond");
            return null;
        }

        IClientInterface clientInterface = null;
        try {
            clientInterface = mWificond.createClientInterface();
        } catch (RemoteException e1) {
            Log.e(TAG, "Failed to get IClientInterface due to remote exception");
            return null;
        }

        if (clientInterface == null) {
            Log.e(TAG, "Could not get IClientInterface instance from wificond");
            return null;
        }
        Binder.allowBlocking(clientInterface.asBinder());

        // Refresh Handlers
        mClientInterface = clientInterface;
...
}


WifiInjector.java
    private static final String WIFICOND_SERVICE_NAME = "wificond";

    public IWificond makeWificond() {
        // We depend on being able to refresh our binder in WifiStateMachine, so don't cache it.
        IBinder binder = ServiceManager.getService(WIFICOND_SERVICE_NAME);
        return IWificond.Stub.asInterface(binder);
    }

wificond.rc
service wificond /system/bin/wificond
    class main
    user wifi
    group wifi net_raw net_admin

system/connectivity/wificond/aidl/android/net/wifi/IWificond.aidl

    @nullable IClientInterface createClientInterface();

 

wificond/Main.cpp
int main(int argc, char** argv) {
  android::base::InitLogging(argv, android::base::LogdLogger(android::base::SYSTEM));
  LOG(INFO) << "wificond is starting up...";

...
  android::wificond::NetlinkManager netlink_manager(event_dispatcher.get());
  if (!netlink_manager.Start()) {
    LOG(ERROR) << "Failed to start netlink manager";
  }
  android::wificond::NetlinkUtils netlink_utils(&netlink_manager);
  android::wificond::ScanUtils scan_utils(&netlink_manager);
  unique_ptr server(new android::wificond::Server(
      unique_ptr(new InterfaceTool),
      unique_ptr(new SupplicantManager()),
      unique_ptr(new HostapdManager()),
      &netlink_utils,
      &scan_utils));
  server->CleanUpSystemState();
  RegisterServiceOrCrash(server.get());

  event_dispatcher->Poll();
...
}

void RegisterServiceOrCrash(const android::sp& service) {
  android::sp sm = android::defaultServiceManager();
  CHECK_EQ(sm != NULL, true) << "Could not obtain IServiceManager";

  CHECK_EQ(sm->addService(android::String16(kServiceName), service),
           android::NO_ERROR);
}

 

wificond/Server.cpp
Server::Server(unique_ptr if_tool,
               unique_ptr supplicant_manager,
               unique_ptr hostapd_manager,
               NetlinkUtils* netlink_utils,
               ScanUtils* scan_utils)
    : if_tool_(std::move(if_tool)),
      supplicant_manager_(std::move(supplicant_manager)),
      hostapd_manager_(std::move(hostapd_manager)),
      netlink_utils_(netlink_utils),
      scan_utils_(scan_utils) {
}

Status Server::createClientInterface(sp* created_interface) {
  InterfaceInfo interface;
  if (!SetupInterface(&interface)) {
    return Status::ok();  // Logging was done internally
  }

  unique_ptr client_interface(new ClientInterfaceImpl(
      wiphy_index_,
      interface.name,
      interface.index,
      interface.mac_address,
      if_tool_.get(),
      supplicant_manager_.get(),
      netlink_utils_,
      scan_utils_));

  *created_interface = client_interface->GetBinder();
  client_interfaces_.push_back(std::move(client_interface));
  BroadcastClientInterfaceReady(client_interfaces_.back()->GetBinder());

  return Status::ok();
}

 

 

更多相关文章

  1. Android休眠唤醒驱动流程分析
  2. Android(安卓)Architecture Components(一)Lifecycle源码分析
  3. Android(安卓)layout_weight案例分析总结
  4. android中wifi原理及流程分析(很经典)
  5. android中wifi原理及流程分析(很经典)
  6. android点击状态分析
  7. 【Android】关于序列化分析的一些好文分享
  8. Android开机向导启动流程分析
  9. [gitbook] Android框架分析系列之Android(安卓)stagefright框架

随机推荐

  1. Android之使用PopupWindow使用和总结
  2. vitamio简介.java
  3. 关于Linux环境下的android真机调试
  4. android 下的ftp注意问题
  5. 1.2 运行android应用软件
  6. Android(安卓)Studio下载、安装和配置+SD
  7. 【Android】第6章(5) DatePickerDialog和Ti
  8. 对android重力测试的一个疑问
  9. Android——Bitmap和Canvas
  10. Android(安卓)Opengl es 写字 笔记