1. frameworks/base/wifi/java/android/net/wifi/WifiManager.java
public boolean setWifiEnabled(boolean enabled) {
mService.setWifiEnabled(mContext.getOpPackageName(), enabled);
}
2. frameworks/base/wifi/java/android/net/wifi/IWifiManager.aidl
boolean setWifiEnabled(String packageName, boolean enable);
3. frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiServiceImpl.java
@Override
public synchronized boolean setWifiEnabled(String packageName, boolean enable)
throws RemoteException {
mWifiController.sendMessage(CMD_WIFI_TOGGLED);
}
4. frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiController.java
狀態機
parent state | child state |
mStaEnabledState | mDeviceActiveState |
mDefaultState | mStaEnabledState |
初始狀態爲mApStaDisabledState,處理CMD_WIFI_TOGGLED,切換至狀態mDeviceActiveState.
state的enter函數,包括parent state.
state | command | next state |
mApStaDisabledState | CMD_WIFI_TOGGLED | transitionTo mDeviceActiveState |
mDeviceActiveState | ||
mStaEnabledState | ||
mDefaultState |
setInitialState(mApStaDisabledState);
class StaEnabledState extends State {
@Override
public void enter() {
Log.d(TAG, "Enter " + getName() + " mScreenOff=" + mScreenOff);
mWifiStateMachine.setSupplicantRunning(true);
}
5.frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiStateMachine.java
public void setSupplicantRunning(boolean enable) {
if (enable) {
sendMessage(CMD_START_SUPPLICANT);
} else {
sendMessage(CMD_STOP_SUPPLICANT);
}
}
狀態機初始狀態爲mInitialState
class InitialState extends State {
@Override
public boolean processMessage(Message message) {
logStateAndMessage(message, this);
switch (message.what) {
case CMD_START_SUPPLICANT:
Pair<Integer, IClientInterface> statusAndInterface =
mWifiNative.setupForClientMode();
...
if (!mWifiNative.enableSupplicant()) {
...
mWifiMonitor.startMonitoring(mInterfaceName, true);
...
transitionTo(mSupplicantStartingState);
break;
...
}
6. frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiNative.java
public Pair<Integer, IClientInterface> setupForClientMode() {
if (!startHalIfNecessary(true)) {
...
IClientInterface iClientInterface = mWificondControl.setupDriverForClientMode();
...
}
private boolean startHalIfNecessary(boolean isStaMode) {
if (!mWifiVendorHal.isVendorHalSupported()) {
Log.i(mTAG, "Vendor HAL not supported, Ignore start...");
return true;
}
return mWifiVendorHal.startVendorHal(isStaMode);
}
7.frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiVendorHal.java
public boolean startVendorHal(boolean isStaMode) {
...
if (!mHalDeviceManager.start()) {
...
IWifiIface iface;
if (isStaMode) {
mIWifiStaIface = mHalDeviceManager.createStaIface(null, null);
...
iface = (IWifiIface) mIWifiStaIface;
if (!registerStaIfaceCallback()) {
...
mIWifiRttController = mHalDeviceManager.createRttController(iface);
...
enableLinkLayerStats();
...
mIWifiChip = mHalDeviceManager.getChip(iface);
...
if (!registerChipCallback()) {
...
}
8.frameworks/opt/net/wifi/service/java/com/android/server/wifi/HalDeviceManager.java
public IWifiStaIface createStaIface(InterfaceDestroyedListener destroyedListener,
Looper looper) {
return (IWifiStaIface) createIface(IfaceType.STA, destroyedListener, looper);
}
private IWifiIface createIface(int ifaceType, InterfaceDestroyedListener destroyedListener,
Looper looper) {
...
WifiChipInfo[] chipInfos = getAllChipInfo();
...
IWifiIface iface = createIfaceIfPossible(chipInfos, ifaceType, destroyedListener,
looper);
...
}
private IWifiIface createIfaceIfPossible(WifiChipInfo[] chipInfos, int ifaceType,
InterfaceDestroyedListener destroyedListener, Looper looper) {
...
if (bestIfaceCreationProposal != null) {
IWifiIface iface = executeChipReconfiguration(bestIfaceCreationProposal, ifaceType);
...
}
private IWifiIface executeChipReconfiguration(IfaceCreationData ifaceCreationData,
int ifaceType) {
...
WifiStatus status = ifaceCreationData.chipInfo.chip.configureChip(
ifaceCreationData.chipModeId);
...
}
9. hardware/interfaces/wifi/1.1/default/wifi_chip.cpp
Return<void> WifiChip::configureChip(ChipModeId mode_id,
configureChip_cb hidl_status_cb) {
return validateAndCall(this,
WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
&WifiChip::configureChipInternal,
hidl_status_cb,
mode_id);
}
WifiStatus WifiChip::configureChipInternal(ChipModeId mode_id) {
...
WifiStatus status = handleChipConfiguration(mode_id);
...
}
WifiStatus WifiChip::handleChipConfiguration(ChipModeId mode_id) {
...
if (mode_id == kStaChipModeId) {
success = mode_controller_.lock()->changeFirmwareMode(IfaceType::STA);
} else {
success = mode_controller_.lock()->changeFirmwareMode(IfaceType::AP);
}
...
}
10.hardware/interfaces/wifi/1.1/default/wifi_mode_controller.cpp
bool WifiModeController::changeFirmwareMode(IfaceType type) {
if (!driver_tool_->LoadDriver()) {
LOG(ERROR) << "Failed to load WiFi driver";
return false;
}
if (!driver_tool_->ChangeFirmwareMode(convertIfaceTypeToFirmwareMode(type))) {
LOG(ERROR) << "Failed to change firmware mode";
return false;
}
return true;
}
11.frameworks/opt/net/wifi/libwifi_hal/driver_tool.cpp
bool DriverTool::LoadDriver() {
return ::wifi_load_driver() == 0;
}
bool DriverTool::ChangeFirmwareMode(int mode) {
const char* fwpath = wifi_get_fw_path(mode);
if (!fwpath) {
return true; // HAL doesn't think we need to load firmware for this mode.
}
if (wifi_change_fw_path(fwpath) != 0) {
// Not all devices actually require firmware reloads, but
// failure to change the firmware path when it is defined is an error.
return false;
}
return true;
}
12.frameworks/opt/net/wifi/libwifi_hal/wifi_hal_common.cpp
int wifi_load_driver() {
#ifdef WIFI_DRIVER_MODULE_PATH
if (is_wifi_driver_loaded()) {
return 0;
}
if (insmod(DRIVER_MODULE_PATH, DRIVER_MODULE_ARG) < 0) return -1;
#endif
#ifdef WIFI_DRIVER_STATE_CTRL_PARAM
if (is_wifi_driver_loaded()) {
return 0;
}
if (wifi_change_driver_state(WIFI_DRIVER_STATE_ON) < 0) return -1;
#endif
property_set(DRIVER_PROP_NAME, "ok");
return 0;
}
int wifi_change_fw_path(const char *fwpath) {
int len;
int fd;
int ret = 0;
if (!fwpath) return ret;
fd = TEMP_FAILURE_RETRY(open(WIFI_DRIVER_FW_PATH_PARAM, O_WRONLY));
if (fd < 0) {
PLOG(ERROR) << "Failed to open wlan fw path param";
return -1;
}
len = strlen(fwpath) + 1;
if (TEMP_FAILURE_RETRY(write(fd, fwpath, len)) != len) {
PLOG(ERROR) << "Failed to write wlan fw path param";
ret = -1;
}
close(fd);
return ret;
}
===============================================================================================
VINTF(vendor interface)
HIDL:HAL interface Definition Language
Binderized HAL through "hwbinder"
VNDK(vendor NDK)
clearly define which AOSP libraries vendor could use
Google maitained versioned VNDK