From 5a2a9e11a8f3f4d82e9d451a2fe06eba9e8b39fc Mon Sep 17 00:00:00 2001 From: Etan Cohen Date: Thu, 24 May 2018 17:47:05 -0700 Subject: [HDM] Add API to check for STA+AP concurrency Add API which checks for availability of STA+AP concurrency (>0 STAs and >0 APs). Bug: 80251951 Test: unit tests on 4 chip configurations Change-Id: I966c522f5a629849ed235803bbb18f1f3e075534 --- .../com/android/server/wifi/HalDeviceManager.java | 53 ++++++++++++++++++ .../android/server/wifi/HalDeviceManagerTest.java | 64 ++++++++++++++++++++++ 2 files changed, 117 insertions(+) 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 @@ -686,6 +686,22 @@ public class HalDeviceManagerTest { // TestChipV1 Specific Tests ////////////////////////////////////////////////////////////////////////////////////// + /** + * 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. @@ -1188,6 +1204,22 @@ public class HalDeviceManagerTest { // TestChipV2 Specific Tests ////////////////////////////////////////////////////////////////////////////////////// + /** + * 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 @@ -1465,6 +1497,22 @@ public class HalDeviceManagerTest { // TestChipV3 Specific Tests ////////////////////////////////////////////////////////////////////////////////////// + /** + * 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 @@ -1730,6 +1778,22 @@ public class HalDeviceManagerTest { // TestChipV4 Specific Tests ////////////////////////////////////////////////////////////////////////////////////// + /** + * 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 -- cgit v1.2.3