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<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();
}