diff options
author | Etan Cohen <etancohen@google.com> | 2018-05-24 17:47:05 -0700 |
---|---|---|
committer | Etan Cohen <etancohen@google.com> | 2018-05-24 18:05:30 -0700 |
commit | 5a2a9e11a8f3f4d82e9d451a2fe06eba9e8b39fc (patch) | |
tree | 51225fd135a3ff2231483aa37ed6f0f03d27e6a5 /service | |
parent | e93744bec9cb63b00b4597d49a20378749634358 (diff) |
[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
Diffstat (limited to 'service')
-rw-r--r-- | service/java/com/android/server/wifi/HalDeviceManager.java | 53 |
1 files changed, 53 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) { |