summaryrefslogtreecommitdiffstats
path: root/service
diff options
context:
space:
mode:
authorEtan Cohen <etancohen@google.com>2019-01-14 14:21:16 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2019-01-14 14:21:16 +0000
commit65fe66d718bec38fcb05e62d7d72761939e98ec8 (patch)
tree7e88e310aa15dae28fe9d3c1f5a90aee3a60ef3b /service
parentb10455f8c6635b7f43e5a5427db70f9c4cb1ac11 (diff)
parent546acc0a946cecafb3f8bfe087a7d877c4694074 (diff)
downloadandroid_frameworks_opt_net_wifi-65fe66d718bec38fcb05e62d7d72761939e98ec8.tar.gz
android_frameworks_opt_net_wifi-65fe66d718bec38fcb05e62d7d72761939e98ec8.tar.bz2
android_frameworks_opt_net_wifi-65fe66d718bec38fcb05e62d7d72761939e98ec8.zip
Merge "Carrier Wi-Fi: Auto-connection to carrier Wi-Fi networks"
Diffstat (limited to 'service')
-rw-r--r--service/java/com/android/server/wifi/CarrierNetworkEvaluator.java130
-rw-r--r--service/java/com/android/server/wifi/WifiConfigManager.java1
-rw-r--r--service/java/com/android/server/wifi/WifiConnectivityManager.java4
-rw-r--r--service/java/com/android/server/wifi/WifiInjector.java5
4 files changed, 138 insertions, 2 deletions
diff --git a/service/java/com/android/server/wifi/CarrierNetworkEvaluator.java b/service/java/com/android/server/wifi/CarrierNetworkEvaluator.java
new file mode 100644
index 000000000..fe2c5f9a5
--- /dev/null
+++ b/service/java/com/android/server/wifi/CarrierNetworkEvaluator.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.wifi;
+
+
+import android.net.wifi.ScanResult;
+import android.net.wifi.WifiConfiguration;
+import android.os.Process;
+import android.util.LocalLog;
+
+import com.android.server.wifi.WifiNetworkSelector.NetworkEvaluator;
+import com.android.server.wifi.util.ScanResultUtil;
+
+import java.util.List;
+
+import javax.annotation.concurrent.NotThreadSafe;
+
+/**
+ * Evaluator to select a Carrier Wi-Fi network which can be connected to. The evaluator performs
+ * two functions:
+ *
+ * 1. Filtering: figure out which of the networks is a Carrier Wi-Fi network (using the
+ * {@link CarrierNetworkConfig} APIs).
+ * 2. Evaluation: current evaluator API has 2 outputs (effectively):
+ * - Connectable networks: all networks which match #1 will be fed to this API
+ * - Selected network: a single network 'selected' by the evaluator. A simple max(RSSI) will be
+ * used to pick one network from among the connectable networks.
+ *
+ * Note: This class is not thread safe and meant to be used only from {@link WifiNetworkSelector}.
+ */
+@NotThreadSafe
+public class CarrierNetworkEvaluator implements NetworkEvaluator {
+ private static final String TAG = "CarrierNetworkEvaluator";
+
+ private final WifiConfigManager mWifiConfigManager;
+ private final CarrierNetworkConfig mCarrierNetworkConfig;
+ private final LocalLog mLocalLog;
+
+ public CarrierNetworkEvaluator(WifiConfigManager wifiConfigManager,
+ CarrierNetworkConfig carrierNetworkConfig, LocalLog localLog) {
+ mWifiConfigManager = wifiConfigManager;
+ mCarrierNetworkConfig = carrierNetworkConfig;
+ mLocalLog = localLog;
+ }
+
+ @Override
+ public String getName() {
+ return TAG;
+ }
+
+ @Override
+ public void update(List<ScanDetail> scanDetails) {
+ // nothing to be done
+ }
+
+ @Override
+ public WifiConfiguration evaluateNetworks(List<ScanDetail> scanDetails,
+ WifiConfiguration currentNetwork, String currentBssid, boolean connected,
+ boolean untrustedNetworkAllowed, OnConnectableListener onConnectableListener) {
+ if (!mCarrierNetworkConfig.isCarrierEncryptionInfoAvailable()) {
+ return null;
+ }
+
+ int currentMaxRssi = Integer.MIN_VALUE;
+ WifiConfiguration configWithMaxRssi = null;
+ for (ScanDetail scanDetail : scanDetails) {
+ ScanResult scanResult = scanDetail.getScanResult();
+
+ if (!ScanResultUtil.isScanResultForEapNetwork(scanResult)
+ || !mCarrierNetworkConfig.isCarrierNetwork(scanResult.SSID)) {
+ continue;
+ }
+
+ WifiConfiguration config = ScanResultUtil.createNetworkFromScanResult(scanResult);
+ config.ephemeral = true;
+
+ // Add the newly created WifiConfiguration to WifiConfigManager.
+ NetworkUpdateResult result = mWifiConfigManager.addOrUpdateNetwork(config,
+ Process.WIFI_UID);
+ if (!result.isSuccess()) {
+ mLocalLog.log(TAG + ": Failed to add carrier network: " + config);
+ continue;
+ }
+ if (!mWifiConfigManager.enableNetwork(result.getNetworkId(), false, Process.WIFI_UID)) {
+ mLocalLog.log(TAG + ": Failed to enable carrier network: " + config);
+ continue;
+ }
+ if (!mWifiConfigManager.setNetworkCandidateScanResult(result.getNetworkId(), scanResult,
+ 0)) {
+ mLocalLog.log(
+ TAG + ": Failed to set network candidate for carrier network: " + config);
+
+ continue;
+ }
+
+ config = mWifiConfigManager.getConfiguredNetwork(result.getNetworkId());
+
+ WifiConfiguration.NetworkSelectionStatus nss = config.getNetworkSelectionStatus();
+ if (nss == null) {
+ mLocalLog.log(TAG + ": null network selection status for: " + config);
+ continue;
+ }
+ if (nss.getCandidate() != null && nss.getCandidate().level < scanResult.level) {
+ mWifiConfigManager.updateScanDetailForNetwork(result.getNetworkId(), scanDetail);
+ }
+
+ onConnectableListener.onConnectable(scanDetail, config, 0);
+ if (scanResult.level > currentMaxRssi) {
+ configWithMaxRssi = config;
+ currentMaxRssi = scanResult.level;
+ }
+ }
+
+ return configWithMaxRssi;
+ }
+}
diff --git a/service/java/com/android/server/wifi/WifiConfigManager.java b/service/java/com/android/server/wifi/WifiConfigManager.java
index 59adadf69..08a4d207f 100644
--- a/service/java/com/android/server/wifi/WifiConfigManager.java
+++ b/service/java/com/android/server/wifi/WifiConfigManager.java
@@ -1824,6 +1824,7 @@ public class WifiConfigManager {
}
WifiConfiguration config = getInternalConfiguredNetwork(networkId);
if (config == null) {
+ Log.e(TAG, "Cannot find network for " + networkId);
return false;
}
config.getNetworkSelectionStatus().setCandidate(scanResult);
diff --git a/service/java/com/android/server/wifi/WifiConnectivityManager.java b/service/java/com/android/server/wifi/WifiConnectivityManager.java
index 48e740f0e..cb0d90b94 100644
--- a/service/java/com/android/server/wifi/WifiConnectivityManager.java
+++ b/service/java/com/android/server/wifi/WifiConnectivityManager.java
@@ -594,7 +594,8 @@ public class WifiConnectivityManager {
Clock clock, LocalLog localLog, SavedNetworkEvaluator savedNetworkEvaluator,
ScoredNetworkEvaluator scoredNetworkEvaluator,
PasspointNetworkEvaluator passpointNetworkEvaluator,
- NetworkSuggestionEvaluator networkSuggestionEvaluator) {
+ NetworkSuggestionEvaluator networkSuggestionEvaluator,
+ CarrierNetworkEvaluator carrierNetworkEvaluator) {
mStateMachine = stateMachine;
mWifiInjector = injector;
mConfigManager = configManager;
@@ -658,6 +659,7 @@ public class WifiConnectivityManager {
if (hs2Enabled) {
mNetworkSelector.registerNetworkEvaluator(passpointNetworkEvaluator);
}
+ mNetworkSelector.registerNetworkEvaluator(carrierNetworkEvaluator);
mNetworkSelector.registerNetworkEvaluator(scoredNetworkEvaluator);
// Listen to WifiConfigManager network update events
diff --git a/service/java/com/android/server/wifi/WifiInjector.java b/service/java/com/android/server/wifi/WifiInjector.java
index 5e714d0bb..7fe017787 100644
--- a/service/java/com/android/server/wifi/WifiInjector.java
+++ b/service/java/com/android/server/wifi/WifiInjector.java
@@ -124,6 +124,7 @@ public class WifiInjector {
private final NetworkSuggestionEvaluator mNetworkSuggestionEvaluator;
private final PasspointNetworkEvaluator mPasspointNetworkEvaluator;
private final ScoredNetworkEvaluator mScoredNetworkEvaluator;
+ private final CarrierNetworkEvaluator mCarrierNetworkEvaluator;
private final WifiNetworkScoreCache mWifiNetworkScoreCache;
private final NetworkScoreManager mNetworkScoreManager;
private WifiScanner mWifiScanner;
@@ -259,6 +260,8 @@ public class WifiInjector {
mScoredNetworkEvaluator = new ScoredNetworkEvaluator(context, clientModeImplLooper,
mFrameworkFacade, mNetworkScoreManager, mWifiConfigManager, mConnectivityLocalLog,
mWifiNetworkScoreCache, mWifiPermissionsUtil);
+ mCarrierNetworkEvaluator = new CarrierNetworkEvaluator(mWifiConfigManager,
+ mCarrierNetworkConfig, mConnectivityLocalLog);
mSimAccessor = new SIMAccessor(mContext);
mPasspointManager = new PasspointManager(mContext, mWifiNative, mWifiKeyStore, mClock,
mSimAccessor, new PasspointObjectFactory(), mWifiConfigManager, mWifiConfigStore,
@@ -572,7 +575,7 @@ public class WifiInjector {
mCarrierNetworkConfig, mWifiMetrics, mWifiCoreHandlerThread.getLooper(),
mClock, mConnectivityLocalLog,
mSavedNetworkEvaluator, mScoredNetworkEvaluator, mPasspointNetworkEvaluator,
- mNetworkSuggestionEvaluator);
+ mNetworkSuggestionEvaluator, mCarrierNetworkEvaluator);
}
/**