summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--service/java/com/android/server/wifi/HalDeviceManager.java53
-rw-r--r--tests/wifitests/src/com/android/server/wifi/HalDeviceManagerTest.java64
2 files changed, 117 insertions, 0 deletions
diff --git a/service/java/com/android/server/wifi/HalDeviceManager.java b/service/java/com/android/server/wifi/HalDeviceManager.java
index 3c61217d7..f570ffcb5 100644
--- a/service/java/com/android/server/wifi/HalDeviceManager.java
+++ b/service/java/com/android/server/wifi/HalDeviceManager.java
@@ -204,6 +204,16 @@ public class HalDeviceManager {
return getSupportedIfaceTypesInternal(chip);
}
+ /**
+ * Checks whether the device (the combination of all Wi-Fi chips on the device) supports a
+ * concurrent combination of 1 or more STAs and 1 or more APs.
+ *
+ * @return true if STA+AP concurrency is supported, false otherwise.
+ */
+ public boolean isConcurrentStaPlusApSupported() {
+ return isConcurrentStaPlusApSupportedInternal();
+ }
+
// interface-specific behavior
/**
@@ -1313,6 +1323,49 @@ public class HalDeviceManager {
return results;
}
+ private boolean isConcurrentStaPlusApSupportedInternal() {
+ if (mDbg) Log.d(TAG, "isConcurrentStaPlusApSupportedInternal");
+
+ synchronized (mLock) {
+ WifiChipInfo[] chipInfos = getAllChipInfo();
+ if (chipInfos == null) {
+ Log.e(TAG, "isConcurrentStaPlusApSupportedInternal: no chip info found");
+ stopWifi(); // major error: shutting down
+ return false;
+ }
+
+ if (!validateInterfaceCache(chipInfos)) {
+ Log.e(TAG, "isConcurrentStaPlusApSupportedInternal: local cache is invalid!");
+ stopWifi(); // major error: shutting down
+ return false;
+ }
+
+ // check whether any chip individually supports AP+STA
+ // TODO b/80270202: this does not fully handle multi-chip behavior
+ for (WifiChipInfo chipInfo : chipInfos) {
+ for (IWifiChip.ChipMode chipMode : chipInfo.availableModes) {
+ for (IWifiChip.ChipIfaceCombination chipIfaceCombo : chipMode
+ .availableCombinations) {
+ int[][] expandedIfaceCombos = expandIfaceCombos(chipIfaceCombo);
+ if (VDBG) {
+ Log.d(TAG, chipIfaceCombo + " expands to " + Arrays.deepToString(
+ expandedIfaceCombos));
+ }
+
+ for (int[] expandedIfaceCombo : expandedIfaceCombos) {
+ if (expandedIfaceCombo[IfaceType.STA] > 0
+ && expandedIfaceCombo[IfaceType.AP] > 0) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
private IWifiIface createIface(int ifaceType, boolean lowPriority,
InterfaceDestroyedListener destroyedListener, Handler handler) {
if (mDbg) {
diff --git a/tests/wifitests/src/com/android/server/wifi/HalDeviceManagerTest.java b/tests/wifitests/src/com/android/server/wifi/HalDeviceManagerTest.java
index f18c52d39..7e74e3070 100644
--- a/tests/wifitests/src/com/android/server/wifi/HalDeviceManagerTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/HalDeviceManagerTest.java
@@ -687,6 +687,22 @@ public class HalDeviceManagerTest {
//////////////////////////////////////////////////////////////////////////////////////
/**
+ * Validate STA+AP concurrency derivation from chip configuration.
+ */
+ @Test
+ public void testIsConcurrentStaPlusApSupportedChipV1() throws Exception {
+ TestChipV1 chipMock = new TestChipV1();
+ chipMock.initialize();
+ mInOrder = inOrder(mServiceManagerMock, mWifiMock, chipMock.chip,
+ mManagerStatusListenerMock);
+ executeAndValidateInitializationSequence();
+ executeAndValidateStartupSequence();
+
+ assertFalse("STA+AP concurrency should be FALSE for TestChipV1",
+ mDut.isConcurrentStaPlusApSupported());
+ }
+
+ /**
* Validate creation of AP interface when in STA mode - but with no interface created. Expect
* a change in chip mode.
*/
@@ -1189,6 +1205,22 @@ public class HalDeviceManagerTest {
//////////////////////////////////////////////////////////////////////////////////////
/**
+ * Validate STA+AP concurrency derivation from chip configuration.
+ */
+ @Test
+ public void testIsConcurrentStaPlusApSupportedChipV2() throws Exception {
+ TestChipV2 chipMock = new TestChipV2();
+ chipMock.initialize();
+ mInOrder = inOrder(mServiceManagerMock, mWifiMock, chipMock.chip,
+ mManagerStatusListenerMock);
+ executeAndValidateInitializationSequence();
+ executeAndValidateStartupSequence();
+
+ assertTrue("STA+AP concurrency should be TRUE for TestChipV2",
+ mDut.isConcurrentStaPlusApSupported());
+ }
+
+ /**
* Validate a flow sequence for test chip 2:
* - create STA
* - create P2P
@@ -1466,6 +1498,22 @@ public class HalDeviceManagerTest {
//////////////////////////////////////////////////////////////////////////////////////
/**
+ * Validate STA+AP concurrency derivation from chip configuration.
+ */
+ @Test
+ public void testIsConcurrentStaPlusApSupportedChipV3() throws Exception {
+ TestChipV3 chipMock = new TestChipV3();
+ chipMock.initialize();
+ mInOrder = inOrder(mServiceManagerMock, mWifiMock, chipMock.chip,
+ mManagerStatusListenerMock);
+ executeAndValidateInitializationSequence();
+ executeAndValidateStartupSequence();
+
+ assertTrue("STA+AP concurrency should be TRUE for TestChipV3",
+ mDut.isConcurrentStaPlusApSupported());
+ }
+
+ /**
* Validate a flow sequence for test chip 3:
* - create STA
* - create P2P
@@ -1731,6 +1779,22 @@ public class HalDeviceManagerTest {
//////////////////////////////////////////////////////////////////////////////////////
/**
+ * Validate STA+AP concurrency derivation from chip configuration.
+ */
+ @Test
+ public void testIsConcurrentStaPlusApSupportedChipV4() throws Exception {
+ TestChipV4 chipMock = new TestChipV4();
+ chipMock.initialize();
+ mInOrder = inOrder(mServiceManagerMock, mWifiMock, chipMock.chip,
+ mManagerStatusListenerMock);
+ executeAndValidateInitializationSequence();
+ executeAndValidateStartupSequence();
+
+ assertTrue("STA+AP concurrency should be TRUE for TestChipV4",
+ mDut.isConcurrentStaPlusApSupported());
+ }
+
+ /**
* Validate a flow sequence for test chip 4:
* - create STA
* - create P2P