diff options
author | David Su <dysu@google.com> | 2019-03-21 20:36:22 -0700 |
---|---|---|
committer | David Su <dysu@google.com> | 2019-03-25 12:02:03 -0700 |
commit | 8046ecc97e403fd8ca355fce983f03e4e6c037c9 (patch) | |
tree | 0a2b3064539d4c2a42091df21bec4e5c74ee7ddc /service/java/com | |
parent | d0c327a079c5a0853e1774b087bad4632bc1cbf2 (diff) | |
download | android_frameworks_opt_net_wifi-8046ecc97e403fd8ca355fce983f03e4e6c037c9.tar.gz android_frameworks_opt_net_wifi-8046ecc97e403fd8ca355fce983f03e4e6c037c9.tar.bz2 android_frameworks_opt_net_wifi-8046ecc97e403fd8ca355fce983f03e4e6c037c9.zip |
Record Nominator ID for all possible nominators
Record Nominator ID for all possible nominators
Bug: 127452844
Test: frameworks/opt/net/wifi/tests/wifitests/runtests.sh
Change-Id: Id1dc5d29662ae4268d2c9c0c54438ea3ac0c841c
Diffstat (limited to 'service/java/com')
7 files changed, 89 insertions, 34 deletions
diff --git a/service/java/com/android/server/wifi/AvailableNetworkNotifier.java b/service/java/com/android/server/wifi/AvailableNetworkNotifier.java index c28d52195..7def2f37a 100644 --- a/service/java/com/android/server/wifi/AvailableNetworkNotifier.java +++ b/service/java/com/android/server/wifi/AvailableNetworkNotifier.java @@ -38,6 +38,7 @@ import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.Messenger; +import android.os.Process; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; @@ -140,11 +141,18 @@ public class AvailableNetworkNotifier { /** System wide identifier for notification in Notification Manager */ private final int mSystemMessageNotificationId; + /** + * The nominator id for this class, from + * {@link com.android.server.wifi.nano.WifiMetricsProto.ConnectionEvent.ConnectionNominator} + */ + private final int mNominatorId; + public AvailableNetworkNotifier( String tag, String storeDataIdentifier, String toggleSettingsName, int notificationIdentifier, + int nominatorId, Context context, Looper looper, FrameworkFacade framework, @@ -158,6 +166,7 @@ public class AvailableNetworkNotifier { mStoreDataIdentifier = storeDataIdentifier; mToggleSettingsName = toggleSettingsName; mSystemMessageNotificationId = notificationIdentifier; + mNominatorId = nominatorId; mContext = context; mHandler = new Handler(looper); mFrameworkFacade = framework; @@ -425,13 +434,19 @@ public class AvailableNetworkNotifier { "User initiated connection to recommended network: " + "\"" + mRecommendedNetwork.SSID + "\""); WifiConfiguration network = createRecommendedNetworkConfig(mRecommendedNetwork); - Message msg = Message.obtain(); - msg.what = WifiManager.CONNECT_NETWORK; - msg.arg1 = WifiConfiguration.INVALID_NETWORK_ID; - msg.obj = network; - msg.replyTo = mSrcMessenger; - mClientModeImpl.sendMessage(msg); - addNetworkToBlacklist(mRecommendedNetwork.SSID); + + NetworkUpdateResult result = mConfigManager.addOrUpdateNetwork(network, Process.WIFI_UID); + if (result.isSuccess()) { + mWifiMetrics.setNominatorForNetwork(result.netId, mNominatorId); + + Message msg = Message.obtain(); + msg.what = WifiManager.CONNECT_NETWORK; + msg.arg1 = result.netId; + msg.obj = null; + msg.replyTo = mSrcMessenger; + mClientModeImpl.sendMessage(msg); + addNetworkToBlacklist(mRecommendedNetwork.SSID); + } mState = STATE_CONNECTING_IN_NOTIFICATION; mHandler.postDelayed( diff --git a/service/java/com/android/server/wifi/CarrierNetworkNotifier.java b/service/java/com/android/server/wifi/CarrierNetworkNotifier.java index 747cf0760..5af400181 100644 --- a/service/java/com/android/server/wifi/CarrierNetworkNotifier.java +++ b/service/java/com/android/server/wifi/CarrierNetworkNotifier.java @@ -26,7 +26,7 @@ import android.os.Looper; import android.provider.Settings; import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; -import com.android.server.wifi.util.ScanResultUtil; +import com.android.server.wifi.nano.WifiMetricsProto; /** * This class handles the "carrier wi-fi network available" notification @@ -50,14 +50,16 @@ public class CarrierNetworkNotifier extends AvailableNetworkNotifier { ClientModeImpl clientModeImpl, ConnectToNetworkNotificationBuilder connectToNetworkNotificationBuilder) { super(TAG, STORE_DATA_IDENTIFIER, TOGGLE_SETTINGS_NAME, - SystemMessage.NOTE_CARRIER_NETWORK_AVAILABLE, context, looper, framework, clock, + SystemMessage.NOTE_CARRIER_NETWORK_AVAILABLE, + WifiMetricsProto.ConnectionEvent.NOMINATOR_CARRIER, + context, looper, framework, clock, wifiMetrics, wifiConfigManager, wifiConfigStore, clientModeImpl, connectToNetworkNotificationBuilder); } @Override WifiConfiguration createRecommendedNetworkConfig(ScanResult recommendedNetwork) { - WifiConfiguration network = ScanResultUtil.createNetworkFromScanResult(recommendedNetwork); + WifiConfiguration network = super.createRecommendedNetworkConfig(recommendedNetwork); int eapMethod = recommendedNetwork.carrierApEapType; if (eapMethod == Eap.SIM || eapMethod == Eap.AKA || eapMethod == Eap.AKA_PRIME) { diff --git a/service/java/com/android/server/wifi/ClientModeImpl.java b/service/java/com/android/server/wifi/ClientModeImpl.java index 7497aaf0c..551817021 100644 --- a/service/java/com/android/server/wifi/ClientModeImpl.java +++ b/service/java/com/android/server/wifi/ClientModeImpl.java @@ -1172,7 +1172,8 @@ public class ClientModeImpl extends StateMachine { private boolean connectToUserSelectNetwork(int netId, int uid, boolean forceReconnect) { logd("connectToUserSelectNetwork netId " + netId + ", uid " + uid + ", forceReconnect = " + forceReconnect); - if (mWifiConfigManager.getConfiguredNetwork(netId) == null) { + WifiConfiguration config = mWifiConfigManager.getConfiguredNetwork(netId); + if (config == null) { loge("connectToUserSelectNetwork Invalid network Id=" + netId); return false; } @@ -1191,6 +1192,10 @@ public class ClientModeImpl extends StateMachine { logi("connectToUserSelectNetwork already connecting/connected=" + netId); } else { mWifiConnectivityManager.prepareForForcedConnection(netId); + if (uid == Process.SYSTEM_UID) { + mWifiMetrics.setNominatorForNetwork(config.networkId, + WifiMetricsProto.ConnectionEvent.NOMINATOR_MANUAL); + } startConnectToNetwork(netId, uid, SUPPLICANT_BSSID_ANY); } return true; diff --git a/service/java/com/android/server/wifi/OpenNetworkNotifier.java b/service/java/com/android/server/wifi/OpenNetworkNotifier.java index 7f61ed9e4..97f390f39 100644 --- a/service/java/com/android/server/wifi/OpenNetworkNotifier.java +++ b/service/java/com/android/server/wifi/OpenNetworkNotifier.java @@ -21,6 +21,7 @@ import android.os.Looper; import android.provider.Settings; import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; +import com.android.server.wifi.nano.WifiMetricsProto; /** * This class handles the "open wi-fi network available" notification @@ -44,7 +45,9 @@ public class OpenNetworkNotifier extends AvailableNetworkNotifier { ClientModeImpl clientModeImpl, ConnectToNetworkNotificationBuilder connectToNetworkNotificationBuilder) { super(TAG, STORE_DATA_IDENTIFIER, TOGGLE_SETTINGS_NAME, - SystemMessage.NOTE_NETWORK_AVAILABLE, context, looper, framework, clock, + SystemMessage.NOTE_NETWORK_AVAILABLE, + WifiMetricsProto.ConnectionEvent.NOMINATOR_OPEN_NETWORK_AVAILABLE, + context, looper, framework, clock, wifiMetrics, wifiConfigManager, wifiConfigStore, clientModeImpl, connectToNetworkNotificationBuilder); } diff --git a/service/java/com/android/server/wifi/WifiMetrics.java b/service/java/com/android/server/wifi/WifiMetrics.java index ccfdbc029..f3a3d1f94 100644 --- a/service/java/com/android/server/wifi/WifiMetrics.java +++ b/service/java/com/android/server/wifi/WifiMetrics.java @@ -373,6 +373,12 @@ public class WifiMetrics { private final CellularLinkLayerStatsCollector mCellularLinkLayerStatsCollector; + /** + * Tracks the nominator for each network (i.e. which entity made the suggestion to connect). + * This object should not be cleared. + */ + private final SparseIntArray mNetworkIdToNominatorId = new SparseIntArray(); + @VisibleForTesting static class NetworkSelectionExperimentResults { public static final int MAX_CHOICES = 10; @@ -644,8 +650,8 @@ public class WifiMetrics { case WifiMetricsProto.ConnectionEvent.NOMINATOR_EXTERNAL_SCORED: sb.append("NOMINATOR_EXTERNAL_SCORED"); break; - case WifiMetricsProto.ConnectionEvent.NOMINATOR_NETREC: - sb.append("NOMINATOR_NETREC"); + case WifiMetricsProto.ConnectionEvent.NOMINATOR_SPECIFIER: + sb.append("NOMINATOR_SPECIFIER"); break; case WifiMetricsProto.ConnectionEvent.NOMINATOR_SAVED_USER_CONNECT_CHOICE: sb.append("NOMINATOR_SAVED_USER_CONNECT_CHOICE"); @@ -988,26 +994,9 @@ public class WifiMetrics { mCurrentConnectionEvent.mConnectionEvent.useRandomizedMac = config.macRandomizationSetting == WifiConfiguration.RANDOMIZATION_PERSISTENT; - if (config.fromWifiNetworkSpecifier) { - mCurrentConnectionEvent.mConnectionEvent.connectionNominator = - WifiMetricsProto.ConnectionEvent.NOMINATOR_NETREC; - } else if (config.fromWifiNetworkSuggestion) { - mCurrentConnectionEvent.mConnectionEvent.connectionNominator = - WifiMetricsProto.ConnectionEvent.NOMINATOR_SUGGESTION; - } else if (config.isPasspoint()) { - mCurrentConnectionEvent.mConnectionEvent.connectionNominator = - WifiMetricsProto.ConnectionEvent.NOMINATOR_PASSPOINT; - } else if (!config.trusted) { - mCurrentConnectionEvent.mConnectionEvent.connectionNominator = - WifiMetricsProto.ConnectionEvent.NOMINATOR_EXTERNAL_SCORED; - } else if (!config.ephemeral) { - mCurrentConnectionEvent.mConnectionEvent.connectionNominator = - WifiMetricsProto.ConnectionEvent.NOMINATOR_SAVED; - } else { - // TODO(b/127452844): populate other nominator fields - mCurrentConnectionEvent.mConnectionEvent.connectionNominator = - WifiMetricsProto.ConnectionEvent.NOMINATOR_UNKNOWN; - } + mCurrentConnectionEvent.mConnectionEvent.connectionNominator = + mNetworkIdToNominatorId.get(config.networkId, + WifiMetricsProto.ConnectionEvent.NOMINATOR_UNKNOWN); ScanResult candidate = config.getNetworkSelectionStatus().getCandidate(); if (candidate != null) { // Cache the RSSI of the candidate, as the connection event level is updated @@ -2728,6 +2717,7 @@ public class WifiMetrics { pw.println("mWifiNetworkSuggestionApiLog:\n" + mWifiNetworkSuggestionApiLog); pw.println("mWifiNetworkSuggestionApiMatchSizeHistogram:\n" + mWifiNetworkRequestApiMatchSizeHistogram); + pw.println("mNetworkIdToNominatorId:\n" + mNetworkIdToNominatorId); } } } @@ -4712,4 +4702,17 @@ public class WifiMetrics { } } } + + /** + * Sets the nominator for a network (i.e. which entity made the suggestion to connect) + * @param networkId the ID of the network, from its {@link WifiConfiguration} + * @param nominatorId the entity that made the suggestion to connect to this network, + * from {@link WifiMetricsProto.ConnectionEvent.ConnectionNominator} + */ + public void setNominatorForNetwork(int networkId, int nominatorId) { + synchronized (mLock) { + if (networkId == WifiConfiguration.INVALID_NETWORK_ID) return; + mNetworkIdToNominatorId.put(networkId, nominatorId); + } + } } diff --git a/service/java/com/android/server/wifi/WifiNetworkFactory.java b/service/java/com/android/server/wifi/WifiNetworkFactory.java index 174379e33..2cd2aa4f9 100644 --- a/service/java/com/android/server/wifi/WifiNetworkFactory.java +++ b/service/java/com/android/server/wifi/WifiNetworkFactory.java @@ -56,6 +56,7 @@ import android.util.Log; import android.util.Pair; import com.android.internal.annotations.VisibleForTesting; +import com.android.server.wifi.nano.WifiMetricsProto; import com.android.server.wifi.util.ExternalCallbackTracker; import com.android.server.wifi.util.ScanResultUtil; import com.android.server.wifi.util.WifiPermissionsUtil; @@ -712,6 +713,9 @@ public class WifiNetworkFactory extends NetworkFactory { // necessary checks when processing CONNECT_NETWORK. int networkId = addNetworkToWifiConfigManager(network); + mWifiMetrics.setNominatorForNetwork(networkId, + WifiMetricsProto.ConnectionEvent.NOMINATOR_SPECIFIER); + // Send the connect request to ClientModeImpl. // TODO(b/117601161): Refactor this. Message msg = Message.obtain(); diff --git a/service/java/com/android/server/wifi/WifiNetworkSelector.java b/service/java/com/android/server/wifi/WifiNetworkSelector.java index e7608ed78..84dba358a 100644 --- a/service/java/com/android/server/wifi/WifiNetworkSelector.java +++ b/service/java/com/android/server/wifi/WifiNetworkSelector.java @@ -35,6 +35,7 @@ import android.util.Pair; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.Preconditions; +import com.android.server.wifi.nano.WifiMetricsProto; import com.android.server.wifi.util.ScanResultUtil; import java.lang.annotation.Retention; @@ -575,6 +576,8 @@ public class WifiNetworkSelector { localLog("After user selection adjustment, the final candidate is:" + WifiNetworkSelector.toNetworkString(candidate) + " : " + scanResultCandidate.BSSID); + mWifiMetrics.setNominatorForNetwork(candidate.networkId, + WifiMetricsProto.ConnectionEvent.NOMINATOR_SAVED_USER_CONNECT_CHOICE); } return candidate; } @@ -650,6 +653,8 @@ public class WifiNetworkSelector { wifiCandidates.add(scanDetail, config, registeredEvaluator.getId(), score); } + mWifiMetrics.setNominatorForNetwork(config.networkId, + evaluatorIdToNominatorId(registeredEvaluator.getId())); } }); if (selectedNetwork == null && choice != null) { @@ -750,6 +755,24 @@ public class WifiNetworkSelector { return selectedNetwork; } + private static int evaluatorIdToNominatorId(@NetworkEvaluator.EvaluatorId int evaluatorId) { + switch (evaluatorId) { + case NetworkEvaluator.EVALUATOR_ID_SAVED: + return WifiMetricsProto.ConnectionEvent.NOMINATOR_SAVED; + case NetworkEvaluator.EVALUATOR_ID_SUGGESTION: + return WifiMetricsProto.ConnectionEvent.NOMINATOR_SUGGESTION; + case NetworkEvaluator.EVALUATOR_ID_PASSPOINT: + return WifiMetricsProto.ConnectionEvent.NOMINATOR_PASSPOINT; + case NetworkEvaluator.EVALUATOR_ID_CARRIER: + return WifiMetricsProto.ConnectionEvent.NOMINATOR_CARRIER; + case NetworkEvaluator.EVALUATOR_ID_SCORED: + return WifiMetricsProto.ConnectionEvent.NOMINATOR_EXTERNAL_SCORED; + default: + Log.e(TAG, "UnrecognizedEvaluatorId" + evaluatorId); + return WifiMetricsProto.ConnectionEvent.NOMINATOR_UNKNOWN; + } + } + private static boolean isSameNetworkSelection(WifiConfiguration c1, WifiConfiguration c2) { if (c1 == null && c2 == null) { return true; |