summaryrefslogtreecommitdiff
path: root/service
diff options
context:
space:
mode:
Diffstat (limited to 'service')
-rw-r--r--service/java/com/android/server/wifi/HalDeviceManager.java53
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) {