diff options
author | Etan Cohen <etancohen@google.com> | 2019-01-14 14:21:16 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2019-01-14 14:21:16 +0000 |
commit | 65fe66d718bec38fcb05e62d7d72761939e98ec8 (patch) | |
tree | 7e88e310aa15dae28fe9d3c1f5a90aee3a60ef3b /service | |
parent | b10455f8c6635b7f43e5a5427db70f9c4cb1ac11 (diff) | |
parent | 546acc0a946cecafb3f8bfe087a7d877c4694074 (diff) | |
download | android_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')
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); } /** |