summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--service/java/com/android/server/wifi/WifiServiceImpl.java43
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java34
2 files changed, 64 insertions, 13 deletions
diff --git a/service/java/com/android/server/wifi/WifiServiceImpl.java b/service/java/com/android/server/wifi/WifiServiceImpl.java
index 0772b4c80..9d12aa000 100644
--- a/service/java/com/android/server/wifi/WifiServiceImpl.java
+++ b/service/java/com/android/server/wifi/WifiServiceImpl.java
@@ -879,6 +879,14 @@ public class WifiServiceImpl extends BaseWifiService {
mLog.info("startSoftAp uid=%").c(Binder.getCallingUid()).flush();
+ SoftApConfiguration softApConfig = null;
+ if (wifiConfig != null) {
+ softApConfig = ApConfigUtil.fromWifiConfiguration(wifiConfig);
+ if (softApConfig == null) {
+ return false;
+ }
+ }
+
if (!mTetheredSoftApTracker.setEnablingIfAllowed()) {
mLog.err("Tethering is already active.").flush();
return false;
@@ -890,17 +898,14 @@ public class WifiServiceImpl extends BaseWifiService {
mLohsSoftApTracker.stopAll();
}
- if (wifiConfig != null) {
- SoftApConfiguration softApConfig = ApConfigUtil.fromWifiConfiguration(wifiConfig);
- if (softApConfig == null) return false;
- return startSoftApInternal(new SoftApModeConfiguration(
- WifiManager.IFACE_IP_MODE_TETHERED,
- softApConfig, mTetheredSoftApTracker.getSoftApCapability()));
- } else {
- return startSoftApInternal(new SoftApModeConfiguration(
- WifiManager.IFACE_IP_MODE_TETHERED, null,
- mTetheredSoftApTracker.getSoftApCapability()));
+ if (!startSoftApInternal(new SoftApModeConfiguration(
+ WifiManager.IFACE_IP_MODE_TETHERED, softApConfig,
+ mTetheredSoftApTracker.getSoftApCapability()))) {
+ mTetheredSoftApTracker.setFailedWhileEnabling();
+ return false;
}
+
+ return true;
}
private boolean validateSoftApBand(int apBand) {
@@ -951,11 +956,15 @@ public class WifiServiceImpl extends BaseWifiService {
mLohsSoftApTracker.stopAll();
}
- return startSoftApInternal(new SoftApModeConfiguration(
+ if (!startSoftApInternal(new SoftApModeConfiguration(
WifiManager.IFACE_IP_MODE_TETHERED, softApConfig,
- mTetheredSoftApTracker.getSoftApCapability()));
- }
+ mTetheredSoftApTracker.getSoftApCapability()))) {
+ mTetheredSoftApTracker.setFailedWhileEnabling();
+ return false;
+ }
+ return true;
+ }
/**
* Internal method to start softap mode. Callers of this method should have already checked
@@ -1053,6 +1062,14 @@ public class WifiServiceImpl extends BaseWifiService {
}
}
+ public void setFailedWhileEnabling() {
+ synchronized (mLock) {
+ if (mTetheredSoftApState == WIFI_AP_STATE_ENABLING) {
+ mTetheredSoftApState = WIFI_AP_STATE_FAILED;
+ }
+ }
+ }
+
public List<WifiClient> getConnectedClients() {
synchronized (mLock) {
return mTetheredSoftApConnectedClients;
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java b/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java
index d91dffbfb..603a4d8f5 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java
@@ -1324,6 +1324,24 @@ public class WifiServiceImplTest extends WifiBaseTest {
}
/**
+ * Verify that startSoftAp() with valid config succeeds after a failed call
+ */
+ @Test
+ public void testStartSoftApWithValidConfigSucceedsAfterFailure() {
+ // First initiate a failed call
+ assertFalse(mWifiServiceImpl.startSoftAp(mApConfig));
+ verify(mActiveModeWarden, never()).startSoftAp(any());
+
+ // Next attempt a valid config
+ WifiConfiguration config = createValidWifiApConfiguration();
+ assertTrue(mWifiServiceImpl.startSoftAp(config));
+ verify(mActiveModeWarden).startSoftAp(mSoftApModeConfigCaptor.capture());
+ WifiConfigurationTestUtil.assertConfigurationEqualForSoftAp(
+ config,
+ mSoftApModeConfigCaptor.getValue().getSoftApConfiguration().toWifiConfiguration());
+ }
+
+ /**
* Verify caller with proper permission can call startTetheredHotspot.
*/
@Test
@@ -1497,6 +1515,22 @@ public class WifiServiceImplTest extends WifiBaseTest {
}
/**
+ * Verify a valied call to startTetheredHotspot succeeds after a failed call.
+ */
+ @Test
+ public void testStartTetheredHotspotWithValidConfigSucceedsAfterFailedCall() {
+ // First issue an invalid call
+ assertFalse(mWifiServiceImpl.startTetheredHotspot(
+ new SoftApConfiguration.Builder().build()));
+ verify(mActiveModeWarden, never()).startSoftAp(any());
+
+ // Now attempt a successful call
+ assertTrue(mWifiServiceImpl.startTetheredHotspot(null));
+ verify(mActiveModeWarden).startSoftAp(mSoftApModeConfigCaptor.capture());
+ assertNull(mSoftApModeConfigCaptor.getValue().getSoftApConfiguration());
+ }
+
+ /**
* Verify caller with proper permission can call stopSoftAp.
*/
@Test