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.rcservice 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<android::wificond::Server> server(new android::wificond::Server( unique_ptr<InterfaceTool>(new InterfaceTool), unique_ptr<SupplicantManager>(new SupplicantManager()), unique_ptr<HostapdManager>(new HostapdManager()), &netlink_utils, &scan_utils)); server->CleanUpSystemState(); RegisterServiceOrCrash(server.get());
event_dispatcher->Poll(); ... }
void RegisterServiceOrCrash(const android::sp<android::IBinder>& service) { android::sp<android::IServiceManager> 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<InterfaceTool> if_tool, unique_ptr<SupplicantManager> supplicant_manager, unique_ptr<HostapdManager> 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<IClientInterface>* created_interface) { InterfaceInfo interface; if (!SetupInterface(&interface)) { return Status::ok(); // Logging was done internally }
unique_ptr<ClientInterfaceImpl> 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(); }