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 ++++++++++++++++++++++ 1 file changed, 53 insertions(+) (limited to 'service') 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) { -- cgit v1.2.3