WifiMetrics.java revision 28a6c752451084392a71b3c70d984ef9e066d4e2
11b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne/* 21b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Copyright (C) 2016 The Android Open Source Project 31b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 41b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Licensed under the Apache License, Version 2.0 (the "License"); 51b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * you may not use this file except in compliance with the License. 61b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * You may obtain a copy of the License at 71b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 81b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * http://www.apache.org/licenses/LICENSE-2.0 91b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Unless required by applicable law or agreed to in writing, software 111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * distributed under the License is distributed on an "AS IS" BASIS, 121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * See the License for the specific language governing permissions and 141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * limitations under the License. 151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhnepackage com.android.server.wifi; 181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 1946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport android.hardware.wifi.supplicant.V1_0.ISupplicantStaIfaceCallback; 204569ebc2277f35b9bd1baa98194f963388e0c4caSohani Raoimport android.net.NetworkAgent; 214dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhneimport android.net.wifi.ScanResult; 2246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport android.net.wifi.SupplicantState; 232532a24b254d724a9b6771d327dc410b32b18602Glen Kuhneimport android.net.wifi.WifiConfiguration; 2446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport android.net.wifi.WifiInfo; 2544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silbersteinimport android.net.wifi.WifiManager; 2646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport android.os.Handler; 2746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport android.os.Looper; 2846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport android.os.Message; 291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport android.util.Base64; 30c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhneimport android.util.Log; 3108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhneimport android.util.Pair; 32c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhneimport android.util.SparseIntArray; 331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 34e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plassimport com.android.internal.annotations.VisibleForTesting; 35910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohenimport com.android.server.wifi.aware.WifiAwareMetrics; 369831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohenimport com.android.server.wifi.hotspot2.ANQPNetworkKey; 37f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhneimport com.android.server.wifi.hotspot2.NetworkDetail; 3808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhneimport com.android.server.wifi.hotspot2.PasspointManager; 3908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhneimport com.android.server.wifi.hotspot2.PasspointMatch; 4008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhneimport com.android.server.wifi.hotspot2.PasspointProvider; 419831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohenimport com.android.server.wifi.hotspot2.Utils; 42da94688198c864bb29be2e9603ebbe9ae6492a87Tamas Berghammerimport com.android.server.wifi.nano.WifiMetricsProto; 43a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chenimport com.android.server.wifi.nano.WifiMetricsProto.ConnectToNetworkNotificationAndActionCount; 44a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadehimport com.android.server.wifi.nano.WifiMetricsProto.PnoScanMetrics; 4505ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadehimport com.android.server.wifi.nano.WifiMetricsProto.SoftApConnectedClientsEvent; 4646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport com.android.server.wifi.nano.WifiMetricsProto.StaEvent; 4746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport com.android.server.wifi.nano.WifiMetricsProto.StaEvent.ConfigInfo; 4862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kimimport com.android.server.wifi.nano.WifiMetricsProto.WpsMetrics; 4902e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohenimport com.android.server.wifi.rtt.RttMetrics; 50f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhneimport com.android.server.wifi.util.InformationElementUtil; 5159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhneimport com.android.server.wifi.util.ScanResultUtil; 52f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne 531b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.io.FileDescriptor; 541b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.io.PrintWriter; 551b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.ArrayList; 5646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport java.util.BitSet; 571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.Calendar; 589831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohenimport java.util.HashMap; 5908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhneimport java.util.HashSet; 6046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport java.util.LinkedList; 611b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.List; 629831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohenimport java.util.Map; 6308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhneimport java.util.Set; 641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne/** 661b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Provides storage for wireless connectivity metrics, as they are generated. 671b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Metrics logged by this class include: 681b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Aggregated connection stats (num of connections, num of failures, ...) 691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Discrete connection event stats (time, duration, failure codes, ...) 701b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Router details (technology type, authentication type, ...) 711b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Scan stats 721b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhnepublic class WifiMetrics { 741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private static final String TAG = "WifiMetrics"; 75c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private static final boolean DBG = false; 767a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne /** 777a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne * Clamp the RSSI poll counts to values between [MIN,MAX]_RSSI_POLL 787a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne */ 797a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne private static final int MAX_RSSI_POLL = 0; 807a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne private static final int MIN_RSSI_POLL = -127; 815cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne public static final int MAX_RSSI_DELTA = 127; 825cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne public static final int MIN_RSSI_DELTA = -127; 835cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne /** Maximum time period between ScanResult and RSSI poll to generate rssi delta datapoint */ 845cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne public static final long TIMEOUT_RSSI_DELTA_MILLIS = 3000; 854569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao private static final int MIN_WIFI_SCORE = 0; 864569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao private static final int MAX_WIFI_SCORE = NetworkAgent.WIFI_BASE_SCORE; 87e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass @VisibleForTesting 88e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass static final int LOW_WIFI_SCORE = 50; // Mobile data score 891b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private final Object mLock = new Object(); 902532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne private static final int MAX_CONNECTION_EVENTS = 256; 9108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne // Largest bucket in the NumConnectableNetworkCount histogram, 9208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne // anything large will be stored in this bucket 9308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne public static final int MAX_CONNECTABLE_SSID_NETWORK_BUCKET = 20; 9408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne public static final int MAX_CONNECTABLE_BSSID_NETWORK_BUCKET = 50; 9508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne public static final int MAX_TOTAL_SCAN_RESULT_SSIDS_BUCKET = 100; 9608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne public static final int MAX_TOTAL_SCAN_RESULTS_BUCKET = 250; 979831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen public static final int MAX_TOTAL_PASSPOINT_APS_BUCKET = 50; 989831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen public static final int MAX_TOTAL_PASSPOINT_UNIQUE_ESS_BUCKET = 20; 999831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen public static final int MAX_PASSPOINT_APS_PER_UNIQUE_ESS_BUCKET = 50; 100973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen public static final int MAX_TOTAL_80211MC_APS_BUCKET = 20; 101a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen private static final int CONNECT_TO_NETWORK_NOTIFICATION_ACTION_KEY_MULTIPLIER = 1000; 10205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh // Max limit for number of soft AP related events, extra events will be dropped. 10305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh private static final int MAX_NUM_SOFT_AP_EVENTS = 256; 104107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne private Clock mClock; 105ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne private boolean mScreenOn; 106ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne private int mWifiState; 107910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen private WifiAwareMetrics mWifiAwareMetrics; 10802e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen private RttMetrics mRttMetrics; 109a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh private final PnoScanMetrics mPnoScanMetrics = new PnoScanMetrics(); 11062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim private final WpsMetrics mWpsMetrics = new WpsMetrics(); 11146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private Handler mHandler; 11208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private WifiConfigManager mWifiConfigManager; 11308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private WifiNetworkSelector mWifiNetworkSelector; 11408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private PasspointManager mPasspointManager; 1151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 1161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Metrics are stored within an instance of the WifiLog proto during runtime, 1171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * The ConnectionEvent, SystemStateEntries & ScanReturnEntries metrics are stored during 1181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * runtime in member lists of this WifiMetrics class, with the final WifiLog proto being pieced 1191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * together at dump-time 1201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 1217a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne private final WifiMetricsProto.WifiLog mWifiLogProto = new WifiMetricsProto.WifiLog(); 1221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 1231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Session information that gets logged for every Wifi connection attempt. 1241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 1257a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne private final List<ConnectionEvent> mConnectionEventList = new ArrayList<>(); 1261b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 1271b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * The latest started (but un-ended) connection attempt 1281b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 1291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private ConnectionEvent mCurrentConnectionEvent; 1301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 1311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Count of number of times each scan return code, indexed by WifiLog.ScanReturnCode 1321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 1337a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne private final SparseIntArray mScanReturnEntries = new SparseIntArray(); 1341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 1351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Mapping of system state to the counts of scans requested in that wifi state * screenOn 1361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * combination. Indexed by WifiLog.WifiState * (1 + screenOn) 1371b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 1387a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne private final SparseIntArray mWifiSystemStateEntries = new SparseIntArray(); 139f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal /** Mapping of RSSI values to counts. */ 140f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal private final SparseIntArray mRssiPollCounts = new SparseIntArray(); 1415cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne /** Mapping of RSSI scan-poll delta values to counts. */ 1425cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne private final SparseIntArray mRssiDeltaCounts = new SparseIntArray(); 1435cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne /** RSSI of the scan result for the last connection event*/ 1445cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne private int mScanResultRssi = 0; 1455cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne /** Boot-relative timestamp when the last candidate scanresult was received, used to calculate 1465cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne RSSI deltas. -1 designates no candidate scanResult being tracked */ 1475cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne private long mScanResultRssiTimestampMillis = -1; 148f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal /** Mapping of alert reason to the respective alert count. */ 149f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal private final SparseIntArray mWifiAlertReasonCounts = new SparseIntArray(); 150107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne /** 151107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne * Records the getElapsedSinceBootMillis (in seconds) that represents the beginning of data 152107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne * capture for for this WifiMetricsProto 153107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne */ 154107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne private long mRecordStartTimeSec; 1554569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao /** Mapping of Wifi Scores to counts */ 1564569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao private final SparseIntArray mWifiScoreCounts = new SparseIntArray(); 15744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein /** Mapping of SoftApManager start SoftAp return codes to counts */ 15844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein private final SparseIntArray mSoftApManagerReturnCodeCounts = new SparseIntArray(); 15908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne 16008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private final SparseIntArray mTotalSsidsInScanHistogram = new SparseIntArray(); 16108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private final SparseIntArray mTotalBssidsInScanHistogram = new SparseIntArray(); 16208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private final SparseIntArray mAvailableOpenSsidsInScanHistogram = new SparseIntArray(); 16308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private final SparseIntArray mAvailableOpenBssidsInScanHistogram = new SparseIntArray(); 16408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private final SparseIntArray mAvailableSavedSsidsInScanHistogram = new SparseIntArray(); 16508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private final SparseIntArray mAvailableSavedBssidsInScanHistogram = new SparseIntArray(); 16608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private final SparseIntArray mAvailableOpenOrSavedSsidsInScanHistogram = new SparseIntArray(); 16708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private final SparseIntArray mAvailableOpenOrSavedBssidsInScanHistogram = new SparseIntArray(); 16808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private final SparseIntArray mAvailableSavedPasspointProviderProfilesInScanHistogram = 16908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne new SparseIntArray(); 17008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private final SparseIntArray mAvailableSavedPasspointProviderBssidsInScanHistogram = 17108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne new SparseIntArray(); 17208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne 173a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen /** Mapping of "Connect to Network" notifications to counts. */ 174a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen private final SparseIntArray mConnectToNetworkNotificationCount = new SparseIntArray(); 175a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen /** Mapping of "Connect to Network" notification user actions to counts. */ 176a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen private final SparseIntArray mConnectToNetworkNotificationActionCount = new SparseIntArray(); 177a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen private int mOpenNetworkRecommenderBlacklistSize = 0; 178a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen private boolean mIsWifiNetworksAvailableNotificationOn = false; 179a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen private int mNumOpenNetworkConnectMessageFailedToSend = 0; 180a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen private int mNumOpenNetworkRecommendationUpdates = 0; 18105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh /** List of soft AP events related to number of connected clients in tethered mode */ 18205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh private final List<SoftApConnectedClientsEvent> mSoftApEventListTethered = new ArrayList<>(); 18305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh /** List of soft AP events related to number of connected clients in local only mode */ 18405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh private final List<SoftApConnectedClientsEvent> mSoftApEventListLocalOnly = new ArrayList<>(); 185a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen 1869831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen private final SparseIntArray mObservedHotspotR1ApInScanHistogram = new SparseIntArray(); 1879831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen private final SparseIntArray mObservedHotspotR2ApInScanHistogram = new SparseIntArray(); 1889831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen private final SparseIntArray mObservedHotspotR1EssInScanHistogram = new SparseIntArray(); 1899831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen private final SparseIntArray mObservedHotspotR2EssInScanHistogram = new SparseIntArray(); 1909831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen private final SparseIntArray mObservedHotspotR1ApsPerEssInScanHistogram = new SparseIntArray(); 1919831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen private final SparseIntArray mObservedHotspotR2ApsPerEssInScanHistogram = new SparseIntArray(); 1929831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen 193973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen private final SparseIntArray mObserved80211mcApInScanHistogram = new SparseIntArray(); 194973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen 195fb165562c8c77a9e5e2452f33aedb8e4369e7a9bSiddharth Ray /** Wifi power metrics*/ 196fb165562c8c77a9e5e2452f33aedb8e4369e7a9bSiddharth Ray private WifiPowerMetrics mWifiPowerMetrics = new WifiPowerMetrics(); 197fb165562c8c77a9e5e2452f33aedb8e4369e7a9bSiddharth Ray 19812d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach /** Wifi Wake metrics */ 19912d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach private final WifiWakeMetrics mWifiWakeMetrics = new WifiWakeMetrics(); 20012d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach 20128a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim private boolean mIsMacRandomizationOn = false; 20228a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim 2031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne class RouterFingerPrint { 2041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private WifiMetricsProto.RouterFingerPrint mRouterFingerPrintProto; 2052532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne RouterFingerPrint() { 2061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mRouterFingerPrintProto = new WifiMetricsProto.RouterFingerPrint(); 2071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 2081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 2091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public String toString() { 2101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne StringBuilder sb = new StringBuilder(); 2111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 2121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append("mConnectionEvent.roamType=" + mRouterFingerPrintProto.roamType); 2131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", mChannelInfo=" + mRouterFingerPrintProto.channelInfo); 2141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", mDtim=" + mRouterFingerPrintProto.dtim); 2151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", mAuthentication=" + mRouterFingerPrintProto.authentication); 2161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", mHidden=" + mRouterFingerPrintProto.hidden); 2171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", mRouterTechnology=" + mRouterFingerPrintProto.routerTechnology); 2181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", mSupportsIpv6=" + mRouterFingerPrintProto.supportsIpv6); 2191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 2201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne return sb.toString(); 2211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 2222532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne public void updateFromWifiConfiguration(WifiConfiguration config) { 223ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne synchronized (mLock) { 224ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (config != null) { 225ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // Is this a hidden network 226ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mRouterFingerPrintProto.hidden = config.hiddenSSID; 227ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // Config may not have a valid dtimInterval set yet, in which case dtim will be zero 228ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // (These are only populated from beacon frame scan results, which are returned as 229ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // scan results from the chip far less frequently than Probe-responses) 230ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (config.dtimInterval > 0) { 231ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mRouterFingerPrintProto.dtim = config.dtimInterval; 232ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } 233ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mCurrentConnectionEvent.mConfigSsid = config.SSID; 234ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // Get AuthType information from config (We do this again from ScanResult after 235ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // associating with BSSID) 236ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (config.allowedKeyManagement != null 237ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne && config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.NONE)) { 238ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto 239ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_OPEN; 240ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } else if (config.isEnterprise()) { 241ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto 242ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_ENTERPRISE; 243ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } else { 244ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto 245ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL; 246ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } 24759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto 24859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne .passpoint = config.isPasspoint(); 249ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // If there's a ScanResult candidate associated with this config already, get it and 250ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // log (more accurate) metrics from it 251ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne ScanResult candidate = config.getNetworkSelectionStatus().getCandidate(); 252ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (candidate != null) { 253ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne updateMetricsFromScanResult(candidate); 254ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } 25596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne } 2562532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 2572532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 2581b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 2591b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 2601b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 2611b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Log event, tracking the start time, end time and result of a wireless connection attempt. 2621b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 2631b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne class ConnectionEvent { 2641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne WifiMetricsProto.ConnectionEvent mConnectionEvent; 26596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne //<TODO> Move these constants into a wifi.proto Enum, and create a new Failure Type field 26696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne //covering more than just l2 failures. see b/27652362 26796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne /** 26896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne * Failure codes, used for the 'level_2_failure_code' Connection event field (covers a lot 26996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne * more failures than just l2 though, since the proto does not have a place to log 27096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne * framework failures) 27196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne */ 2722532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne // Failure is unknown 27396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_UNKNOWN = 0; 2742532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne // NONE 27596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_NONE = 1; 2762532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne // ASSOCIATION_REJECTION_EVENT 27796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_ASSOCIATION_REJECTION = 2; 2782532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne // AUTHENTICATION_FAILURE_EVENT 27996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_AUTHENTICATION_FAILURE = 3; 2802532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne // SSID_TEMP_DISABLED (Also Auth failure) 28196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_SSID_TEMP_DISABLED = 4; 2824dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne // reconnect() or reassociate() call to WifiNative failed 28396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_CONNECT_NETWORK_FAILED = 5; 2842532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne // NETWORK_DISCONNECTION_EVENT 28596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_NETWORK_DISCONNECTION = 6; 2864dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne // NEW_CONNECTION_ATTEMPT before previous finished 28796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_NEW_CONNECTION_ATTEMPT = 7; 28896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne // New connection attempt to the same network & bssid 28996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_REDUNDANT_CONNECTION_ATTEMPT = 8; 29096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne // Roam Watchdog timer triggered (Roaming timed out) 29196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_ROAM_TIMEOUT = 9; 29296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne // DHCP failure 29396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_DHCP = 10; 294b195838541edf2597659b217291079c52623d85cRoshan Pius // ASSOCIATION_TIMED_OUT 295b195838541edf2597659b217291079c52623d85cRoshan Pius public static final int FAILURE_ASSOCIATION_TIMED_OUT = 11; 29696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne 2974dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne RouterFingerPrint mRouterFingerPrint; 2984dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne private long mRealStartTime; 2994dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne private long mRealEndTime; 3004dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne private String mConfigSsid; 3014dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne private String mConfigBssid; 302ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne private int mWifiState; 303ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne private boolean mScreenOn; 3042532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne 3051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private ConnectionEvent() { 3061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mConnectionEvent = new WifiMetricsProto.ConnectionEvent(); 307947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne mRealEndTime = 0; 308947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne mRealStartTime = 0; 3092532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mRouterFingerPrint = new RouterFingerPrint(); 3102532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mConnectionEvent.routerFingerprint = mRouterFingerPrint.mRouterFingerPrintProto; 3114dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mConfigSsid = "<NULL>"; 3124dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mConfigBssid = "<NULL>"; 313ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mWifiState = WifiMetricsProto.WifiLog.WIFI_UNKNOWN; 314ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mScreenOn = false; 3151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 3161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 3171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public String toString() { 3181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne StringBuilder sb = new StringBuilder(); 3191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append("startTime="); 3201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne Calendar c = Calendar.getInstance(); 3211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 3221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne c.setTimeInMillis(mConnectionEvent.startTimeMillis); 3231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(mConnectionEvent.startTimeMillis == 0 ? " <null>" : 3241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne String.format("%tm-%td %tH:%tM:%tS.%tL", c, c, c, c, c, c)); 3254dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(", SSID="); 3264dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(mConfigSsid); 3274dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(", BSSID="); 3284dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(mConfigBssid); 3294dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(", durationMillis="); 3301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(mConnectionEvent.durationTakenToConnectMillis); 3312532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append(", roamType="); 3324dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne switch(mConnectionEvent.roamType) { 3332532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne case 1: 3342532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append("ROAM_NONE"); 3352532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne break; 3362532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne case 2: 3372532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append("ROAM_DBDC"); 3382532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne break; 3392532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne case 3: 3402532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append("ROAM_ENTERPRISE"); 3412532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne break; 3422532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne case 4: 3432532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append("ROAM_USER_SELECTED"); 3442532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne break; 3452532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne case 5: 3462532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append("ROAM_UNRELATED"); 3472532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne break; 3482532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne default: 3492532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append("ROAM_UNKNOWN"); 3502532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 3514dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(", connectionResult="); 3524dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(mConnectionEvent.connectionResult); 3531b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", level2FailureCode="); 3544dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne switch(mConnectionEvent.level2FailureCode) { 35596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_NONE: 3564dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("NONE"); 3574dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 35896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_ASSOCIATION_REJECTION: 3594dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("ASSOCIATION_REJECTION"); 3604dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 36196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_AUTHENTICATION_FAILURE: 3624dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("AUTHENTICATION_FAILURE"); 3634dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 36496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_SSID_TEMP_DISABLED: 3654dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("SSID_TEMP_DISABLED"); 3664dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 36796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_CONNECT_NETWORK_FAILED: 3684dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("CONNECT_NETWORK_FAILED"); 3694dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 37096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_NETWORK_DISCONNECTION: 3714dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("NETWORK_DISCONNECTION"); 3724dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 37396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_NEW_CONNECTION_ATTEMPT: 3744dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("NEW_CONNECTION_ATTEMPT"); 3754dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 37696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_REDUNDANT_CONNECTION_ATTEMPT: 37796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne sb.append("REDUNDANT_CONNECTION_ATTEMPT"); 37896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne break; 37996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_ROAM_TIMEOUT: 38096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne sb.append("ROAM_TIMEOUT"); 38196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne break; 38296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_DHCP: 38396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne sb.append("DHCP"); 384b195838541edf2597659b217291079c52623d85cRoshan Pius break; 385b195838541edf2597659b217291079c52623d85cRoshan Pius case FAILURE_ASSOCIATION_TIMED_OUT: 386b195838541edf2597659b217291079c52623d85cRoshan Pius sb.append("ASSOCIATION_TIMED_OUT"); 387b195838541edf2597659b217291079c52623d85cRoshan Pius break; 3884dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne default: 3894dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("UNKNOWN"); 3904dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 3914dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne } 3921b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", connectivityLevelFailureCode="); 3934dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne switch(mConnectionEvent.connectivityLevelFailureCode) { 3944dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne case WifiMetricsProto.ConnectionEvent.HLF_NONE: 3954dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("NONE"); 3964dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 3974dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne case WifiMetricsProto.ConnectionEvent.HLF_DHCP: 3984dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("DHCP"); 3994dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 4004dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne case WifiMetricsProto.ConnectionEvent.HLF_NO_INTERNET: 4014dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("NO_INTERNET"); 4024dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 4034dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne case WifiMetricsProto.ConnectionEvent.HLF_UNWANTED: 4044dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("UNWANTED"); 4054dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 4064dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne default: 4074dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("UNKNOWN"); 4084dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 4094dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne } 4104dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(", signalStrength="); 4114dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(mConnectionEvent.signalStrength); 412ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append(", wifiState="); 413ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne switch(mWifiState) { 414ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_DISABLED: 415ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append("WIFI_DISABLED"); 416ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne break; 417ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_DISCONNECTED: 418ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append("WIFI_DISCONNECTED"); 419ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne break; 420ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_ASSOCIATED: 421ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append("WIFI_ASSOCIATED"); 422ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne break; 423ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne default: 424ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append("WIFI_UNKNOWN"); 425ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne break; 426ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne } 427ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append(", screenOn="); 428ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append(mScreenOn); 429ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append(". mRouterFingerprint: "); 4301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(mRouterFingerPrint.toString()); 4311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 4321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne return sb.toString(); 4331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 4341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 4351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 43602e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen public WifiMetrics(Clock clock, Looper looper, WifiAwareMetrics awareMetrics, 43702e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen RttMetrics rttMetrics) { 438107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne mClock = clock; 4391b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mCurrentConnectionEvent = null; 440ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mScreenOn = true; 441ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mWifiState = WifiMetricsProto.WifiLog.WIFI_DISABLED; 442107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne mRecordStartTimeSec = mClock.getElapsedSinceBootMillis() / 1000; 443910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen mWifiAwareMetrics = awareMetrics; 44402e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen mRttMetrics = rttMetrics; 44546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 44646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mHandler = new Handler(looper) { 44746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public void handleMessage(Message msg) { 44846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne synchronized (mLock) { 44946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne processMessage(msg); 45046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 45146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 45246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne }; 4531b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 4541b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 45508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne /** Sets internal WifiConfigManager member */ 45608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne public void setWifiConfigManager(WifiConfigManager wifiConfigManager) { 45708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mWifiConfigManager = wifiConfigManager; 45808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 45908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne 46008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne /** Sets internal WifiNetworkSelector member */ 46108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne public void setWifiNetworkSelector(WifiNetworkSelector wifiNetworkSelector) { 46208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mWifiNetworkSelector = wifiNetworkSelector; 46308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 46408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne 46508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne /** Sets internal PasspointManager member */ 46608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne public void setPasspointManager(PasspointManager passpointManager) { 46708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mPasspointManager = passpointManager; 46808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 46908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne 470a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh /** 471a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh * Increment total number of attempts to start a pno scan 472a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh */ 473a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh public void incrementPnoScanStartAttempCount() { 474a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh synchronized (mLock) { 475a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh mPnoScanMetrics.numPnoScanAttempts++; 476a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh } 477a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh } 478a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh 479a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh /** 480a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh * Increment total number of attempts with pno scan failed 481a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh */ 482a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh public void incrementPnoScanFailedCount() { 483a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh synchronized (mLock) { 484a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh mPnoScanMetrics.numPnoScanFailed++; 485a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh } 486a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh } 487a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh 488a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh /** 489a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh * Increment number of pno scans started successfully over offload 490a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh */ 491a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh public void incrementPnoScanStartedOverOffloadCount() { 492a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh synchronized (mLock) { 493a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh mPnoScanMetrics.numPnoScanStartedOverOffload++; 494a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh } 495a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh } 496a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh 497a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh /** 498a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh * Increment number of pno scans failed over offload 499a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh */ 500a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh public void incrementPnoScanFailedOverOffloadCount() { 501a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh synchronized (mLock) { 502a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh mPnoScanMetrics.numPnoScanFailedOverOffload++; 503a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh } 504a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh } 505a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh 506a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh /** 507a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh * Increment number of times pno scan found a result 508a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh */ 509a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh public void incrementPnoFoundNetworkEventCount() { 510a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh synchronized (mLock) { 511a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh mPnoScanMetrics.numPnoFoundNetworkEvents++; 512a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh } 513a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh } 514a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh 51562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim /** 51662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim * Increment total number of wps connection attempts 51762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim */ 51862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim public void incrementWpsAttemptCount() { 51962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim synchronized (mLock) { 52062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim mWpsMetrics.numWpsAttempts++; 52162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim } 52262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim } 52362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim 52462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim /** 52562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim * Increment total number of wps connection success 52662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim */ 52762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim public void incrementWpsSuccessCount() { 52862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim synchronized (mLock) { 52962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim mWpsMetrics.numWpsSuccess++; 53062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim } 53162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim } 53262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim 53362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim /** 53462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim * Increment total number of wps failure on start 53562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim */ 53662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim public void incrementWpsStartFailureCount() { 53762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim synchronized (mLock) { 53862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim mWpsMetrics.numWpsStartFailure++; 53962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim } 54062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim } 54162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim 54262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim /** 54362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim * Increment total number of wps overlap failure 54462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim */ 54562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim public void incrementWpsOverlapFailureCount() { 54662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim synchronized (mLock) { 54762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim mWpsMetrics.numWpsOverlapFailure++; 54862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim } 54962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim } 55062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim 55162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim /** 55262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim * Increment total number of wps timeout failure 55362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim */ 55462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim public void incrementWpsTimeoutFailureCount() { 55562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim synchronized (mLock) { 55662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim mWpsMetrics.numWpsTimeoutFailure++; 55762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim } 55862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim } 55962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim 56062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim /** 56162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim * Increment total number of other wps failure during connection 56262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim */ 56362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim public void incrementWpsOtherConnectionFailureCount() { 56462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim synchronized (mLock) { 56562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim mWpsMetrics.numWpsOtherConnectionFailure++; 56662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim } 56762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim } 56862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim 56962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim /** 57062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim * Increment total number of supplicant failure after wps 57162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim */ 57262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim public void incrementWpsSupplicantFailureCount() { 57362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim synchronized (mLock) { 57462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim mWpsMetrics.numWpsSupplicantFailure++; 57562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim } 57662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim } 57762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim 57862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim /** 57962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim * Increment total number of wps cancellation 58062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim */ 58162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim public void incrementWpsCancellationCount() { 58262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim synchronized (mLock) { 58362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim mWpsMetrics.numWpsCancellation++; 58462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim } 58562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim } 58662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim 587c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne // Values used for indexing SystemStateEntries 588c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private static final int SCREEN_ON = 1; 589c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private static final int SCREEN_OFF = 0; 590c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 5911b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 5921b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Create a new connection event. Call when wifi attempts to make a new network connection 5931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * If there is a current 'un-ended' connection event, it will be ended with UNKNOWN connectivity 5941b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * failure code. 5951b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Gathers and sets the RouterFingerPrint data as well 5961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 597947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne * @param config WifiConfiguration of the config used for the current connection attempt 5981b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param roamType Roam type that caused connection attempt, see WifiMetricsProto.WifiLog.ROAM_X 5991b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 60096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public void startConnectionEvent(WifiConfiguration config, String targetBSSID, int roamType) { 6011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 60296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne // Check if this is overlapping another current connection event 60396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne if (mCurrentConnectionEvent != null) { 60496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne //Is this new Connection Event the same as the current one 60596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne if (mCurrentConnectionEvent.mConfigSsid != null 60696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne && mCurrentConnectionEvent.mConfigBssid != null 60796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne && config != null 60896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne && mCurrentConnectionEvent.mConfigSsid.equals(config.SSID) 60996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne && (mCurrentConnectionEvent.mConfigBssid.equals("any") 61096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne || mCurrentConnectionEvent.mConfigBssid.equals(targetBSSID))) { 61196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mCurrentConnectionEvent.mConfigBssid = targetBSSID; 61296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne // End Connection Event due to new connection attempt to the same network 61396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne endConnectionEvent(ConnectionEvent.FAILURE_REDUNDANT_CONNECTION_ATTEMPT, 61496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne WifiMetricsProto.ConnectionEvent.HLF_NONE); 61596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne } else { 61696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne // End Connection Event due to new connection attempt to different network 61796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne endConnectionEvent(ConnectionEvent.FAILURE_NEW_CONNECTION_ATTEMPT, 61896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne WifiMetricsProto.ConnectionEvent.HLF_NONE); 61996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne } 62096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne } 62196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne //If past maximum connection events, start removing the oldest 6224dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne while(mConnectionEventList.size() >= MAX_CONNECTION_EVENTS) { 6234dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mConnectionEventList.remove(0); 6244dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne } 6254dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mCurrentConnectionEvent = new ConnectionEvent(); 6264dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.startTimeMillis = 627107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne mClock.getWallClockMillis(); 62896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mCurrentConnectionEvent.mConfigBssid = targetBSSID; 6294dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.roamType = roamType; 6304dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.updateFromWifiConfiguration(config); 63196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mCurrentConnectionEvent.mConfigBssid = "any"; 632107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne mCurrentConnectionEvent.mRealStartTime = mClock.getElapsedSinceBootMillis(); 633ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mCurrentConnectionEvent.mWifiState = mWifiState; 634ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mCurrentConnectionEvent.mScreenOn = mScreenOn; 6354dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mConnectionEventList.add(mCurrentConnectionEvent); 6365cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mScanResultRssiTimestampMillis = -1; 6375cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne if (config != null) { 6385cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne ScanResult candidate = config.getNetworkSelectionStatus().getCandidate(); 6395cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne if (candidate != null) { 6405cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne // Cache the RSSI of the candidate, as the connection event level is updated 6415cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne // from other sources (polls, bssid_associations) and delta requires the 6425cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne // scanResult rssi 6435cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mScanResultRssi = candidate.level; 6445cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mScanResultRssiTimestampMillis = mClock.getElapsedSinceBootMillis(); 6455cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 6465cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 6471b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 6481b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 6491b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 6501b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 6512532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne * set the RoamType of the current ConnectionEvent (if any) 6522532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne */ 6532532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne public void setConnectionEventRoamType(int roamType) { 654ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne synchronized (mLock) { 655ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (mCurrentConnectionEvent != null) { 656ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.roamType = roamType; 657ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } 6582532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 6592532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 660f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne 661f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne /** 662f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne * Set AP related metrics from ScanDetail 663f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne */ 664f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne public void setConnectionScanDetail(ScanDetail scanDetail) { 665ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne synchronized (mLock) { 666ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (mCurrentConnectionEvent != null && scanDetail != null) { 667ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne NetworkDetail networkDetail = scanDetail.getNetworkDetail(); 668ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne ScanResult scanResult = scanDetail.getScanResult(); 669ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne //Ensure that we have a networkDetail, and that it corresponds to the currently 670ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne //tracked connection attempt 671ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (networkDetail != null && scanResult != null 672ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne && mCurrentConnectionEvent.mConfigSsid != null 673ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne && mCurrentConnectionEvent.mConfigSsid 674ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne .equals("\"" + networkDetail.getSSID() + "\"")) { 675ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne updateMetricsFromNetworkDetail(networkDetail); 676ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne updateMetricsFromScanResult(scanResult); 677ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } 678f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne } 679f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne } 680f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne } 681f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne 6822532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne /** 6831b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * End a Connection event record. Call when wifi connection attempt succeeds or fails. 6841b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * If a Connection event has not been started and is active when .end is called, a new one is 6851b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * created with zero duration. 6861b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 6871b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param level2FailureCode Level 2 failure code returned by supplicant 6881b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param connectivityFailureCode WifiMetricsProto.ConnectionEvent.HLF_X 6891b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 6901b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public void endConnectionEvent(int level2FailureCode, int connectivityFailureCode) { 6911b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 6922532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne if (mCurrentConnectionEvent != null) { 6932532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne boolean result = (level2FailureCode == 1) 6942532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne && (connectivityFailureCode == WifiMetricsProto.ConnectionEvent.HLF_NONE); 6952532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.connectionResult = result ? 1 : 0; 696107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne mCurrentConnectionEvent.mRealEndTime = mClock.getElapsedSinceBootMillis(); 6972532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.durationTakenToConnectMillis = (int) 6982532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne (mCurrentConnectionEvent.mRealEndTime 6992532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne - mCurrentConnectionEvent.mRealStartTime); 7002532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.level2FailureCode = level2FailureCode; 7012532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.connectivityLevelFailureCode = 7022532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne connectivityFailureCode; 703f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne // ConnectionEvent already added to ConnectionEvents List. Safe to null current here 7042532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mCurrentConnectionEvent = null; 7055cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne if (!result) { 7065cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mScanResultRssiTimestampMillis = -1; 7075cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 7081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 7091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 7101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 7111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 7122b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne /** 7132b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne * Set ConnectionEvent DTIM Interval (if set), and 802.11 Connection mode, from NetworkDetail 7142b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne */ 7152b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne private void updateMetricsFromNetworkDetail(NetworkDetail networkDetail) { 7162b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne int dtimInterval = networkDetail.getDtimInterval(); 7172b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne if (dtimInterval > 0) { 7182b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.dtim = 7192b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne dtimInterval; 7202b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } 7212b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne int connectionWifiMode; 7222b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne switch (networkDetail.getWifiMode()) { 7232b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne case InformationElementUtil.WifiMode.MODE_UNDEFINED: 7242b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_UNKNOWN; 7252b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 7262b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne case InformationElementUtil.WifiMode.MODE_11A: 7272b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_A; 7282b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 7292b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne case InformationElementUtil.WifiMode.MODE_11B: 7302b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_B; 7312b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 7322b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne case InformationElementUtil.WifiMode.MODE_11G: 7332b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_G; 7342b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 7352b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne case InformationElementUtil.WifiMode.MODE_11N: 7362b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_N; 7372b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 7382b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne case InformationElementUtil.WifiMode.MODE_11AC : 7392b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_AC; 7402b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 7412b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne default: 7422b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_OTHER; 7432b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 7442b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } 7452b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto 7462b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne .routerTechnology = connectionWifiMode; 7472b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } 7482b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne 7492b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne /** 7502b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne * Set ConnectionEvent RSSI and authentication type from ScanResult 7512b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne */ 7522b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne private void updateMetricsFromScanResult(ScanResult scanResult) { 7532b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.signalStrength = scanResult.level; 7542b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication = 7552b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne WifiMetricsProto.RouterFingerPrint.AUTH_OPEN; 75696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mCurrentConnectionEvent.mConfigBssid = scanResult.BSSID; 7572b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne if (scanResult.capabilities != null) { 75859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (ScanResultUtil.isScanResultForWepNetwork(scanResult)) { 7592b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication = 7602b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL; 76159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } else if (ScanResultUtil.isScanResultForPskNetwork(scanResult)) { 7622b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication = 7632b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL; 76459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } else if (ScanResultUtil.isScanResultForEapNetwork(scanResult)) { 7652b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication = 7662b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne WifiMetricsProto.RouterFingerPrint.AUTH_ENTERPRISE; 7672b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } 7682b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } 76996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.channelInfo = 77096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne scanResult.frequency; 7712b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } 7722b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne 7731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne void setIsLocationEnabled(boolean enabled) { 7741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 7751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.isLocationEnabled = enabled; 7761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 7771b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 7781b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 7791b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne void setIsScanningAlwaysEnabled(boolean enabled) { 7801b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 7811b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.isScanningAlwaysEnabled = enabled; 7821b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 7831b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 7841b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 7851b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 7861b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Increment Non Empty Scan Results count 7871b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 7881b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public void incrementNonEmptyScanResultCount() { 789c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (DBG) Log.v(TAG, "incrementNonEmptyScanResultCount"); 7901b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 7911b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.numNonEmptyScanResults++; 7921b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 7931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 7941b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 7951b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 7961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Increment Empty Scan Results count 7971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 7981b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public void incrementEmptyScanResultCount() { 799c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (DBG) Log.v(TAG, "incrementEmptyScanResultCount"); 8001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 8011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.numEmptyScanResults++; 8021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 8031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 8041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 8051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 806c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * Increment background scan count 807c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 808c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public void incrementBackgroundScanCount() { 809c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (DBG) Log.v(TAG, "incrementBackgroundScanCount"); 810c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne synchronized (mLock) { 811c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.numBackgroundScans++; 812c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 813c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 814c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 815c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 816c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * Get Background scan count 817c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 818c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public int getBackgroundScanCount() { 819c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne synchronized (mLock) { 820c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return mWifiLogProto.numBackgroundScans; 821c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 822c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 823c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 824c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 82570ce5a4cbaf5aaccd4e542e7bb87196fb4464a6eGlen Kuhne * Increment oneshot scan count, and the associated WifiSystemScanStateCount entry 826c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 827c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public void incrementOneshotScanCount() { 828c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne synchronized (mLock) { 829c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.numOneshotScans++; 830c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 83170ce5a4cbaf5aaccd4e542e7bb87196fb4464a6eGlen Kuhne incrementWifiSystemScanStateCount(mWifiState, mScreenOn); 832c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 833c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 834c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 835424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang * Increment connectivity oneshot scan count. 836424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang */ 837424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang public void incrementConnectivityOneshotScanCount() { 838424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang synchronized (mLock) { 839424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang mWifiLogProto.numConnectivityOneshotScans++; 840424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang } 841424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang } 842424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang 843424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang /** 844c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * Get oneshot scan count 845c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 846c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public int getOneshotScanCount() { 847c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne synchronized (mLock) { 848c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return mWifiLogProto.numOneshotScans; 849c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 850c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 851c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 852424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang /** 853424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang * Get connectivity oneshot scan count 854424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang */ 855424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang public int getConnectivityOneshotScanCount() { 856424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang synchronized (mLock) { 857424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang return mWifiLogProto.numConnectivityOneshotScans; 858424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang } 859424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang } 860424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang 86105a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius /** 86205a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius * Increment oneshot scan count for external apps. 86305a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius */ 86405a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius public void incrementExternalAppOneshotScanRequestsCount() { 86505a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius synchronized (mLock) { 86605a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius mWifiLogProto.numExternalAppOneshotScanRequests++; 86705a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius } 86805a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius } 86905a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius /** 87005a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius * Increment oneshot scan throttle count for external foreground apps. 87105a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius */ 87205a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius public void incrementExternalForegroundAppOneshotScanRequestsThrottledCount() { 87305a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius synchronized (mLock) { 87405a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius mWifiLogProto.numExternalForegroundAppOneshotScanRequestsThrottled++; 87505a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius } 87605a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius } 87705a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius 87805a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius /** 87905a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius * Increment oneshot scan throttle count for external background apps. 88005a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius */ 88105a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius public void incrementExternalBackgroundAppOneshotScanRequestsThrottledCount() { 88205a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius synchronized (mLock) { 88305a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius mWifiLogProto.numExternalBackgroundAppOneshotScanRequestsThrottled++; 88405a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius } 88505a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius } 88605a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius 887c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private String returnCodeToString(int scanReturnCode) { 888c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne switch(scanReturnCode){ 889c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.SCAN_UNKNOWN: 890c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "SCAN_UNKNOWN"; 891c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.SCAN_SUCCESS: 892c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "SCAN_SUCCESS"; 893c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.SCAN_FAILURE_INTERRUPTED: 894c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "SCAN_FAILURE_INTERRUPTED"; 895c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.SCAN_FAILURE_INVALID_CONFIGURATION: 896c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "SCAN_FAILURE_INVALID_CONFIGURATION"; 897c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.FAILURE_WIFI_DISABLED: 898c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "FAILURE_WIFI_DISABLED"; 899c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne default: 900c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "<UNKNOWN>"; 901c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 902c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 903c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 904c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 9051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Increment count of scan return code occurrence 9061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 9071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param scanReturnCode Return code from scan attempt WifiMetricsProto.WifiLog.SCAN_X 9081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 909c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public void incrementScanReturnEntry(int scanReturnCode, int countToAdd) { 9101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 911c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (DBG) Log.v(TAG, "incrementScanReturnEntry " + returnCodeToString(scanReturnCode)); 912c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne int entry = mScanReturnEntries.get(scanReturnCode); 913c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne entry += countToAdd; 9141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mScanReturnEntries.put(scanReturnCode, entry); 9151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 9161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 917c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 918c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * Get the count of this scanReturnCode 919c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * @param scanReturnCode that we are getting the count for 920c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 921c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public int getScanReturnEntry(int scanReturnCode) { 922c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne synchronized (mLock) { 923c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return mScanReturnEntries.get(scanReturnCode); 924c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 925c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 926c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 927c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private String wifiSystemStateToString(int state) { 928c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne switch(state){ 929c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_UNKNOWN: 930c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "WIFI_UNKNOWN"; 931c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_DISABLED: 932c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "WIFI_DISABLED"; 933c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_DISCONNECTED: 934c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "WIFI_DISCONNECTED"; 935c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_ASSOCIATED: 936c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "WIFI_ASSOCIATED"; 937c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne default: 938c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "default"; 939c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 940c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 9411b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 9421b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 9431b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Increments the count of scans initiated by each wifi state, accounts for screenOn/Off 9441b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 9451b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param state State of the system when scan was initiated, see WifiMetricsProto.WifiLog.WIFI_X 9461b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param screenOn Is the screen on 9471b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 9481b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public void incrementWifiSystemScanStateCount(int state, boolean screenOn) { 9491b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 950c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (DBG) { 951c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne Log.v(TAG, "incrementWifiSystemScanStateCount " + wifiSystemStateToString(state) 952c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + " " + screenOn); 9531b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 954c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne int index = (state * 2) + (screenOn ? SCREEN_ON : SCREEN_OFF); 955c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne int entry = mWifiSystemStateEntries.get(index); 956c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne entry++; 957c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiSystemStateEntries.put(index, entry); 958c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 959c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 960c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 961c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 962c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * Get the count of this system State Entry 963c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 964c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public int getSystemStateCount(int state, boolean screenOn) { 965c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne synchronized (mLock) { 966c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne int index = state * 2 + (screenOn ? SCREEN_ON : SCREEN_OFF); 967c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return mWifiSystemStateEntries.get(index); 9681b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 9691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 9701b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 971ce003b812aead64dcb36647180991150021b24c1Glen Kuhne /** 9725f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * Increment number of times the Watchdog of Last Resort triggered, resetting the wifi stack 9735f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 9745f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void incrementNumLastResortWatchdogTriggers() { 9755f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 9765f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogTriggers++; 9775f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 9785f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 9795f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 9805f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * @param count number of networks over bad association threshold when watchdog triggered 9815f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 9825f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void addCountToNumLastResortWatchdogBadAssociationNetworksTotal(int count) { 9835f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 9845f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal += count; 9855f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 9865f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 9875f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 9885f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * @param count number of networks over bad authentication threshold when watchdog triggered 9895f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 9905f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void addCountToNumLastResortWatchdogBadAuthenticationNetworksTotal(int count) { 9915f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 9925f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal += count; 9935f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 9945f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 9955f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 9965f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * @param count number of networks over bad dhcp threshold when watchdog triggered 9975f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 9985f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void addCountToNumLastResortWatchdogBadDhcpNetworksTotal(int count) { 9995f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 10005f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal += count; 10015f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 10025f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 10035f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 10045f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * @param count number of networks over bad other threshold when watchdog triggered 10055f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 10065f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void addCountToNumLastResortWatchdogBadOtherNetworksTotal(int count) { 10075f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 10085f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal += count; 10095f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 10105f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 10115f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 10125f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * @param count number of networks seen when watchdog triggered 10135f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 10145f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void addCountToNumLastResortWatchdogAvailableNetworksTotal(int count) { 10155f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 10165f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal += count; 10175f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 10185f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 10195f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 10205f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * Increment count of triggers with atleast one bad association network 10215f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 10225f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void incrementNumLastResortWatchdogTriggersWithBadAssociation() { 10235f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 10245f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation++; 10255f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 10265f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 10275f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 10285f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * Increment count of triggers with atleast one bad authentication network 10295f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 10305f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void incrementNumLastResortWatchdogTriggersWithBadAuthentication() { 10315f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 10325f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication++; 10335f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 10345f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 10355f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 10365f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * Increment count of triggers with atleast one bad dhcp network 10375f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 10385f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void incrementNumLastResortWatchdogTriggersWithBadDhcp() { 10395f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 10405f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp++; 10415f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 10425f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 10435f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 10445f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * Increment count of triggers with atleast one bad other network 10455f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 10465f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void incrementNumLastResortWatchdogTriggersWithBadOther() { 10475f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 10485f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogTriggersWithBadOther++; 10495f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 10505f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 10515f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne 10525f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 1053ce003b812aead64dcb36647180991150021b24c1Glen Kuhne * Increment number of times connectivity watchdog confirmed pno is working 1054ce003b812aead64dcb36647180991150021b24c1Glen Kuhne */ 1055ce003b812aead64dcb36647180991150021b24c1Glen Kuhne public void incrementNumConnectivityWatchdogPnoGood() { 1056ce003b812aead64dcb36647180991150021b24c1Glen Kuhne synchronized (mLock) { 1057ce003b812aead64dcb36647180991150021b24c1Glen Kuhne mWifiLogProto.numConnectivityWatchdogPnoGood++; 1058ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 1059ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 1060ce003b812aead64dcb36647180991150021b24c1Glen Kuhne /** 1061ce003b812aead64dcb36647180991150021b24c1Glen Kuhne * Increment number of times connectivity watchdog found pno not working 1062ce003b812aead64dcb36647180991150021b24c1Glen Kuhne */ 1063ce003b812aead64dcb36647180991150021b24c1Glen Kuhne public void incrementNumConnectivityWatchdogPnoBad() { 1064ce003b812aead64dcb36647180991150021b24c1Glen Kuhne synchronized (mLock) { 1065ce003b812aead64dcb36647180991150021b24c1Glen Kuhne mWifiLogProto.numConnectivityWatchdogPnoBad++; 1066ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 1067ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 1068ce003b812aead64dcb36647180991150021b24c1Glen Kuhne /** 1069ce003b812aead64dcb36647180991150021b24c1Glen Kuhne * Increment number of times connectivity watchdog confirmed background scan is working 1070ce003b812aead64dcb36647180991150021b24c1Glen Kuhne */ 1071ce003b812aead64dcb36647180991150021b24c1Glen Kuhne public void incrementNumConnectivityWatchdogBackgroundGood() { 1072ce003b812aead64dcb36647180991150021b24c1Glen Kuhne synchronized (mLock) { 1073ce003b812aead64dcb36647180991150021b24c1Glen Kuhne mWifiLogProto.numConnectivityWatchdogBackgroundGood++; 1074ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 1075ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 1076ce003b812aead64dcb36647180991150021b24c1Glen Kuhne /** 1077ce003b812aead64dcb36647180991150021b24c1Glen Kuhne * Increment number of times connectivity watchdog found background scan not working 1078ce003b812aead64dcb36647180991150021b24c1Glen Kuhne */ 1079ce003b812aead64dcb36647180991150021b24c1Glen Kuhne public void incrementNumConnectivityWatchdogBackgroundBad() { 1080ce003b812aead64dcb36647180991150021b24c1Glen Kuhne synchronized (mLock) { 1081ce003b812aead64dcb36647180991150021b24c1Glen Kuhne mWifiLogProto.numConnectivityWatchdogBackgroundBad++; 1082ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 1083ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 1084ce003b812aead64dcb36647180991150021b24c1Glen Kuhne 10857a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne /** 108646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Increment various poll related metrics, and cache performance data for StaEvent logging 108746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 108846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public void handlePollResult(WifiInfo wifiInfo) { 108946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mLastPollRssi = wifiInfo.getRssi(); 109046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mLastPollLinkSpeed = wifiInfo.getLinkSpeed(); 109146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mLastPollFreq = wifiInfo.getFrequency(); 109246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne incrementRssiPollRssiCount(mLastPollRssi); 109346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 109446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 109546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 10967a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne * Increment occurence count of RSSI level from RSSI poll. 10977a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne * Ignores rssi values outside the bounds of [MIN_RSSI_POLL, MAX_RSSI_POLL] 10987a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne */ 10997a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne public void incrementRssiPollRssiCount(int rssi) { 11007a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne if (!(rssi >= MIN_RSSI_POLL && rssi <= MAX_RSSI_POLL)) { 11017a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne return; 11027a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne } 11037a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne synchronized (mLock) { 11047a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne int count = mRssiPollCounts.get(rssi); 11057a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne mRssiPollCounts.put(rssi, count + 1); 11065cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne maybeIncrementRssiDeltaCount(rssi - mScanResultRssi); 11075cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 11085cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 11095cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne 11105cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne /** 11115cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * Increment occurence count of difference between scan result RSSI and the first RSSI poll. 11125cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * Ignores rssi values outside the bounds of [MIN_RSSI_DELTA, MAX_RSSI_DELTA] 11135cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * mLock must be held when calling this method. 11145cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne */ 11155cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne private void maybeIncrementRssiDeltaCount(int rssi) { 11165cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne // Check if this RSSI poll is close enough to a scan result RSSI to log a delta value 11175cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne if (mScanResultRssiTimestampMillis >= 0) { 11185cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne long timeDelta = mClock.getElapsedSinceBootMillis() - mScanResultRssiTimestampMillis; 11195cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne if (timeDelta <= TIMEOUT_RSSI_DELTA_MILLIS) { 11205cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne if (rssi >= MIN_RSSI_DELTA && rssi <= MAX_RSSI_DELTA) { 11215cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne int count = mRssiDeltaCounts.get(rssi); 11225cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mRssiDeltaCounts.put(rssi, count + 1); 11235cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 11245cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 11255cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mScanResultRssiTimestampMillis = -1; 11267a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne } 11277a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne } 11287a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne 1129da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne /** 11301c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne * Increment count of Watchdog successes. 11311c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne */ 11321c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne public void incrementNumLastResortWatchdogSuccesses() { 11331c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne synchronized (mLock) { 11341c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne mWifiLogProto.numLastResortWatchdogSuccesses++; 11351c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne } 11361c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne } 11371c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne 11381c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne /** 11391f2ef2776476457b3eb2df70e39d53770c6b2b77xshu * Increment the count of network connection failures that happened after watchdog has been 11401f2ef2776476457b3eb2df70e39d53770c6b2b77xshu * triggered. 11411f2ef2776476457b3eb2df70e39d53770c6b2b77xshu */ 11421f2ef2776476457b3eb2df70e39d53770c6b2b77xshu public void incrementWatchdogTotalConnectionFailureCountAfterTrigger() { 11431f2ef2776476457b3eb2df70e39d53770c6b2b77xshu synchronized (mLock) { 11441f2ef2776476457b3eb2df70e39d53770c6b2b77xshu mWifiLogProto.watchdogTotalConnectionFailureCountAfterTrigger++; 11451f2ef2776476457b3eb2df70e39d53770c6b2b77xshu } 11461f2ef2776476457b3eb2df70e39d53770c6b2b77xshu } 11471f2ef2776476457b3eb2df70e39d53770c6b2b77xshu 11481f2ef2776476457b3eb2df70e39d53770c6b2b77xshu /** 1149338d87ce46cf0766005f747bb82ac590ceaff54dxshu * Sets the time taken for wifi to connect after a watchdog triggers a restart. 1150338d87ce46cf0766005f747bb82ac590ceaff54dxshu * @param milliseconds 1151338d87ce46cf0766005f747bb82ac590ceaff54dxshu */ 1152338d87ce46cf0766005f747bb82ac590ceaff54dxshu public void setWatchdogSuccessTimeDurationMs(long ms) { 1153338d87ce46cf0766005f747bb82ac590ceaff54dxshu synchronized (mLock) { 1154338d87ce46cf0766005f747bb82ac590ceaff54dxshu mWifiLogProto.watchdogTriggerToConnectionSuccessDurationMs = ms; 1155338d87ce46cf0766005f747bb82ac590ceaff54dxshu } 1156338d87ce46cf0766005f747bb82ac590ceaff54dxshu } 1157338d87ce46cf0766005f747bb82ac590ceaff54dxshu 1158338d87ce46cf0766005f747bb82ac590ceaff54dxshu /** 1159f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal * Increments the count of alerts by alert reason. 1160f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal * 1161f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal * @param reason The cause of the alert. The reason values are driver-specific. 1162f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal */ 1163f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal public void incrementAlertReasonCount(int reason) { 1164f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal if (reason > WifiLoggerHal.WIFI_ALERT_REASON_MAX 1165f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal || reason < WifiLoggerHal.WIFI_ALERT_REASON_MIN) { 1166f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal reason = WifiLoggerHal.WIFI_ALERT_REASON_RESERVED; 1167f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 1168f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal synchronized (mLock) { 1169f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal int alertCount = mWifiAlertReasonCounts.get(reason); 1170f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal mWifiAlertReasonCounts.put(reason, alertCount + 1); 1171f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 1172f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 1173f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal 1174f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal /** 117559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne * Counts all the different types of networks seen in a set of scan results 117659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne */ 117759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne public void countScanResults(List<ScanDetail> scanDetails) { 117859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (scanDetails == null) { 117959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne return; 118059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 118159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne int totalResults = 0; 118259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne int openNetworks = 0; 118359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne int personalNetworks = 0; 118459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne int enterpriseNetworks = 0; 118559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne int hiddenNetworks = 0; 118659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne int hotspot2r1Networks = 0; 118759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne int hotspot2r2Networks = 0; 118859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne for (ScanDetail scanDetail : scanDetails) { 118959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne NetworkDetail networkDetail = scanDetail.getNetworkDetail(); 119059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne ScanResult scanResult = scanDetail.getScanResult(); 119159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne totalResults++; 119259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (networkDetail != null) { 119359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (networkDetail.isHiddenBeaconFrame()) { 119459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne hiddenNetworks++; 119559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 119659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (networkDetail.getHSRelease() != null) { 119759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R1) { 119859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne hotspot2r1Networks++; 119959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } else if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R2) { 120059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne hotspot2r2Networks++; 120159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 120259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 120359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 120459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (scanResult != null && scanResult.capabilities != null) { 120559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (ScanResultUtil.isScanResultForEapNetwork(scanResult)) { 120659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne enterpriseNetworks++; 120759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } else if (ScanResultUtil.isScanResultForPskNetwork(scanResult) 120859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne || ScanResultUtil.isScanResultForWepNetwork(scanResult)) { 120959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne personalNetworks++; 121059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } else { 121159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne openNetworks++; 121259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 121359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 121459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 121559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne synchronized (mLock) { 121659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numTotalScanResults += totalResults; 121759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numOpenNetworkScanResults += openNetworks; 121859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numPersonalNetworkScanResults += personalNetworks; 121959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numEnterpriseNetworkScanResults += enterpriseNetworks; 122059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numHiddenNetworkScanResults += hiddenNetworks; 122159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numHotspot2R1NetworkScanResults += hotspot2r1Networks; 122259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numHotspot2R2NetworkScanResults += hotspot2r2Networks; 122359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numScans++; 122459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 122559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 122659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne 1227e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass private boolean mWifiWins = false; // Based on scores, use wifi instead of mobile data? 1228e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass 122959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne /** 12304569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao * Increments occurence of a particular wifi score calculated 12314569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao * in WifiScoreReport by current connected network. Scores are bounded 1232e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass * within [MIN_WIFI_SCORE, MAX_WIFI_SCORE] to limit size of SparseArray. 1233e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass * 1234e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass * Also records events when the current score breaches significant thresholds. 12354569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao */ 12364569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao public void incrementWifiScoreCount(int score) { 12374569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao if (score < MIN_WIFI_SCORE || score > MAX_WIFI_SCORE) { 12384569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao return; 12394569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao } 12404569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao synchronized (mLock) { 12414569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao int count = mWifiScoreCounts.get(score); 12424569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao mWifiScoreCounts.put(score, count + 1); 1243e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass 1244e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass boolean wifiWins = mWifiWins; 1245e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass if (mWifiWins && score < LOW_WIFI_SCORE) { 1246e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass wifiWins = false; 1247e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass } else if (!mWifiWins && score > LOW_WIFI_SCORE) { 1248e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass wifiWins = true; 1249e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass } 1250e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass mLastScore = score; 1251e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass if (wifiWins != mWifiWins) { 1252e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass mWifiWins = wifiWins; 1253e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass StaEvent event = new StaEvent(); 1254e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass event.type = StaEvent.TYPE_SCORE_BREACH; 1255e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass addStaEvent(event); 1256e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass } 12574569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao } 12584569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao } 125959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne 126044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein /** 126144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein * Increments occurence of the results from attempting to start SoftAp. 126244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein * Maps the |result| and WifiManager |failureCode| constant to proto defined SoftApStartResult 126344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein * codes. 126444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein */ 126544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein public void incrementSoftApStartResult(boolean result, int failureCode) { 126644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein synchronized (mLock) { 126744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein if (result) { 126844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein int count = mSoftApManagerReturnCodeCounts.get( 126944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_STARTED_SUCCESSFULLY); 127044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mSoftApManagerReturnCodeCounts.put( 127144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_STARTED_SUCCESSFULLY, 127244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein count + 1); 127344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein return; 127444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein } 127544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein 127644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein // now increment failure modes - if not explicitly handled, dump into the general 127744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein // error bucket. 127844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein if (failureCode == WifiManager.SAP_START_FAILURE_NO_CHANNEL) { 127944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein int count = mSoftApManagerReturnCodeCounts.get( 128044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_NO_CHANNEL); 128144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mSoftApManagerReturnCodeCounts.put( 128244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_NO_CHANNEL, 128344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein count + 1); 128444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein } else { 128544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein // failure mode not tracked at this time... count as a general error for now. 128644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein int count = mSoftApManagerReturnCodeCounts.get( 128744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_GENERAL_ERROR); 128844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mSoftApManagerReturnCodeCounts.put( 128944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_GENERAL_ERROR, 129044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein count + 1); 129144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein } 129244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein } 129344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein } 129444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein 1295bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius /** 129605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh * Adds a record indicating the current up state of soft AP 129705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh */ 129805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh public void addSoftApUpChangedEvent(boolean isUp, int mode) { 129905ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh SoftApConnectedClientsEvent event = new SoftApConnectedClientsEvent(); 130005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh event.eventType = isUp ? SoftApConnectedClientsEvent.SOFT_AP_UP : 130105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh SoftApConnectedClientsEvent.SOFT_AP_DOWN; 130205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh event.numConnectedClients = 0; 130305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh addSoftApConnectedClientsEvent(event, mode); 130405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh } 130505ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh 130605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh /** 130705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh * Adds a record for current number of associated stations to soft AP 130805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh */ 130905ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh public void addSoftApNumAssociatedStationsChangedEvent(int numStations, int mode) { 131005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh SoftApConnectedClientsEvent event = new SoftApConnectedClientsEvent(); 131105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh event.eventType = SoftApConnectedClientsEvent.NUM_CLIENTS_CHANGED; 131205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh event.numConnectedClients = numStations; 131305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh addSoftApConnectedClientsEvent(event, mode); 131405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh } 131505ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh 131605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh /** 131705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh * Adds a record to the corresponding event list based on mode param 131805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh */ 131905ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh private void addSoftApConnectedClientsEvent(SoftApConnectedClientsEvent event, int mode) { 132005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh synchronized (mLock) { 132105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh List<SoftApConnectedClientsEvent> softApEventList; 132205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh switch (mode) { 132305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh case WifiManager.IFACE_IP_MODE_TETHERED: 132405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh softApEventList = mSoftApEventListTethered; 132505ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh break; 132605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh case WifiManager.IFACE_IP_MODE_LOCAL_ONLY: 132705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh softApEventList = mSoftApEventListLocalOnly; 132805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh break; 132905ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh default: 133005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh return; 133105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh } 133205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh 133305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh if (softApEventList.size() > MAX_NUM_SOFT_AP_EVENTS) { 133405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh return; 133505ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh } 133605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh 13374de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh event.timeStampMillis = mClock.getElapsedSinceBootMillis(); 133805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh softApEventList.add(event); 133905ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh } 134005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh } 134105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh 134205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh /** 13434de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh * Updates current soft AP events with channel info 13444de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh */ 13454de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh public void addSoftApChannelSwitchedEvent(int frequency, int bandwidth, int mode) { 13464de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh synchronized (mLock) { 13474de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh List<SoftApConnectedClientsEvent> softApEventList; 13484de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh switch (mode) { 13494de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh case WifiManager.IFACE_IP_MODE_TETHERED: 13504de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh softApEventList = mSoftApEventListTethered; 13514de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh break; 13524de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh case WifiManager.IFACE_IP_MODE_LOCAL_ONLY: 13534de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh softApEventList = mSoftApEventListLocalOnly; 13544de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh break; 13554de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh default: 13564de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh return; 13574de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh } 13584de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh 13594de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh for (int index = softApEventList.size() - 1; index >= 0; index--) { 13604de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh SoftApConnectedClientsEvent event = softApEventList.get(index); 13614de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh 13624de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh if (event != null && event.eventType == SoftApConnectedClientsEvent.SOFT_AP_UP) { 13634de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh event.channelFrequency = frequency; 13644de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh event.channelBandwidth = bandwidth; 13654de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh break; 13664de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh } 13674de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh } 13684de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh } 13694de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh } 13704de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh 13714de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh /** 1372bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius * Increment number of times the HAL crashed. 1373bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius */ 1374bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius public void incrementNumHalCrashes() { 1375bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius synchronized (mLock) { 1376bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius mWifiLogProto.numHalCrashes++; 1377bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius } 1378bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius } 1379bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius 1380bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius /** 1381bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius * Increment number of times the Wificond crashed. 1382bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius */ 1383bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius public void incrementNumWificondCrashes() { 1384bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius synchronized (mLock) { 1385bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius mWifiLogProto.numWificondCrashes++; 1386bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius } 1387bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius } 1388bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius 1389bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius /** 1390d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius * Increment number of times the supplicant crashed. 1391d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius */ 1392d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius public void incrementNumSupplicantCrashes() { 1393d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius synchronized (mLock) { 139465a9143d6c93624837da3867f1cadf2daab62236Roshan Pius mWifiLogProto.numSupplicantCrashes++; 1395d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius } 1396d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius } 1397d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius 1398d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius /** 139927c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius * Increment number of times the hostapd crashed. 140027c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius */ 140127c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius public void incrementNumHostapdCrashes() { 140227c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius synchronized (mLock) { 140365a9143d6c93624837da3867f1cadf2daab62236Roshan Pius mWifiLogProto.numHostapdCrashes++; 140427c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius } 140527c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius } 140627c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius 140727c6f0c111f97e95e3388e9702218cf9e481abb1Roshan Pius /** 1408bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius * Increment number of times the wifi on failed due to an error in HAL. 1409bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius */ 14105ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius public void incrementNumSetupClientInterfaceFailureDueToHal() { 1411bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius synchronized (mLock) { 14125ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius mWifiLogProto.numSetupClientInterfaceFailureDueToHal++; 1413bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius } 1414bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius } 1415bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius 1416bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius /** 1417bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius * Increment number of times the wifi on failed due to an error in wificond. 1418bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius */ 14195ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius public void incrementNumSetupClientInterfaceFailureDueToWificond() { 1420bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius synchronized (mLock) { 14215ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius mWifiLogProto.numSetupClientInterfaceFailureDueToWificond++; 1422bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius } 1423bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius } 1424bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius 142526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu /** 142665a9143d6c93624837da3867f1cadf2daab62236Roshan Pius * Increment number of times the wifi on failed due to an error in supplicant. 1427d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius */ 14285ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius public void incrementNumSetupClientInterfaceFailureDueToSupplicant() { 1429d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius synchronized (mLock) { 14305ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius mWifiLogProto.numSetupClientInterfaceFailureDueToSupplicant++; 14315ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius } 14325ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius } 14335ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius 14345ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius /** 14355ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius * Increment number of times the SoftAp on failed due to an error in HAL. 14365ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius */ 14375ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius public void incrementNumSetupSoftApInterfaceFailureDueToHal() { 14385ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius synchronized (mLock) { 14395ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius mWifiLogProto.numSetupSoftApInterfaceFailureDueToHal++; 14405ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius } 14415ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius } 14425ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius 14435ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius /** 14445ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius * Increment number of times the SoftAp on failed due to an error in wificond. 14455ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius */ 14465ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius public void incrementNumSetupSoftApInterfaceFailureDueToWificond() { 14475ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius synchronized (mLock) { 14485ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius mWifiLogProto.numSetupSoftApInterfaceFailureDueToWificond++; 14495ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius } 14505ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius } 14515ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius 14525ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius /** 14535ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius * Increment number of times the SoftAp on failed due to an error in hostapd. 14545ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius */ 14555ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius public void incrementNumSetupSoftApInterfaceFailureDueToHostapd() { 14565ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius synchronized (mLock) { 14575ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius mWifiLogProto.numSetupSoftApInterfaceFailureDueToHostapd++; 1458d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius } 1459d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius } 1460d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius 1461d2f09d1534b94adbfaf8f3e4b36abc5558fee37eRoshan Pius /** 1462a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius * Increment number of times we got client interface down. 1463a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius */ 1464a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius public void incrementNumClientInterfaceDown() { 1465a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius synchronized (mLock) { 1466a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius mWifiLogProto.numClientInterfaceDown++; 1467a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius } 1468a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius } 1469a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius 1470a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius /** 1471a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius * Increment number of times we got client interface down. 1472a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius */ 1473a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius public void incrementNumSoftApInterfaceDown() { 1474a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius synchronized (mLock) { 1475a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius mWifiLogProto.numSoftApInterfaceDown++; 1476a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius } 1477a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius } 1478a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius 1479a79e9c8ea6461b65cef7a8542af088b8f2945ea2Roshan Pius /** 148026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu * Increment number of times Passpoint provider being installed. 148126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu */ 148226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu public void incrementNumPasspointProviderInstallation() { 148326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu synchronized (mLock) { 148426b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu mWifiLogProto.numPasspointProviderInstallation++; 148526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu } 148626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu } 148726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu 148826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu /** 148926b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu * Increment number of times Passpoint provider is installed successfully. 149026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu */ 149126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu public void incrementNumPasspointProviderInstallSuccess() { 149226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu synchronized (mLock) { 149326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu mWifiLogProto.numPasspointProviderInstallSuccess++; 149426b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu } 149526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu } 149626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu 149726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu /** 149826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu * Increment number of times Passpoint provider being uninstalled. 149926b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu */ 150026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu public void incrementNumPasspointProviderUninstallation() { 150126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu synchronized (mLock) { 150226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu mWifiLogProto.numPasspointProviderUninstallation++; 150326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu } 150426b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu } 150526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu 150626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu /** 150726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu * Increment number of times Passpoint provider is uninstalled successfully. 150826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu */ 150926b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu public void incrementNumPasspointProviderUninstallSuccess() { 151026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu synchronized (mLock) { 151126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu mWifiLogProto.numPasspointProviderUninstallSuccess++; 151226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu } 151326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu } 1514bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius 151508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne /** 151608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne * Increment N-Way network selection decision histograms: 151708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne * Counts the size of various sets of scanDetails within a scan, and increment the occurrence 151808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne * of that size for the associated histogram. There are ten histograms generated for each 151908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne * combination of: {SSID, BSSID} *{Total, Saved, Open, Saved_or_Open, Passpoint} 152008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne * Only performs this count if isFullBand is true, otherwise, increments the partial scan count 152108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne */ 152208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne public void incrementAvailableNetworksHistograms(List<ScanDetail> scanDetails, 152308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne boolean isFullBand) { 152408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne synchronized (mLock) { 152508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne if (mWifiConfigManager == null || mWifiNetworkSelector == null 152608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne || mPasspointManager == null) { 152708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne return; 152808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 152908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne if (!isFullBand) { 153008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mWifiLogProto.partialAllSingleScanListenerResults++; 153108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne return; 153208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 153308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne Set<ScanResultMatchInfo> ssids = new HashSet<ScanResultMatchInfo>(); 153408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne int bssids = 0; 153508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne Set<ScanResultMatchInfo> openSsids = new HashSet<ScanResultMatchInfo>(); 153608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne int openBssids = 0; 153708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne Set<ScanResultMatchInfo> savedSsids = new HashSet<ScanResultMatchInfo>(); 153808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne int savedBssids = 0; 153908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne // openOrSavedSsids calculated from union of savedSsids & openSsids 154008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne int openOrSavedBssids = 0; 154108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne Set<PasspointProvider> savedPasspointProviderProfiles = 154208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne new HashSet<PasspointProvider>(); 154308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne int savedPasspointProviderBssids = 0; 15449831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen int passpointR1Aps = 0; 15459831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen int passpointR2Aps = 0; 15469831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen Map<ANQPNetworkKey, Integer> passpointR1UniqueEss = new HashMap<>(); 15479831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen Map<ANQPNetworkKey, Integer> passpointR2UniqueEss = new HashMap<>(); 1548973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen int supporting80211mcAps = 0; 154908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne for (ScanDetail scanDetail : scanDetails) { 155008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne NetworkDetail networkDetail = scanDetail.getNetworkDetail(); 155108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne ScanResult scanResult = scanDetail.getScanResult(); 1552533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen 1553533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen // statistics to be collected for ALL APs (irrespective of signal power) 1554533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen if (networkDetail.is80211McResponderSupport()) { 1555533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen supporting80211mcAps++; 155608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 1557533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen 155808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne ScanResultMatchInfo matchInfo = ScanResultMatchInfo.fromScanResult(scanResult); 155908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne Pair<PasspointProvider, PasspointMatch> providerMatch = null; 156008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne PasspointProvider passpointProvider = null; 156108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne if (networkDetail.isInterworking()) { 156208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne providerMatch = 156308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mPasspointManager.matchProvider(scanResult); 156408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne passpointProvider = providerMatch != null ? providerMatch.first : null; 15659831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen 15669831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R1) { 15679831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen passpointR1Aps++; 15689831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen } else if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R2) { 15699831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen passpointR2Aps++; 15709831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen } 15719831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen 15729831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen long bssid = 0; 15739831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen boolean validBssid = false; 15749831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen try { 15759831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen bssid = Utils.parseMac(scanResult.BSSID); 15769831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen validBssid = true; 15779831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen } catch (IllegalArgumentException e) { 15789831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen Log.e(TAG, 15799831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen "Invalid BSSID provided in the scan result: " + scanResult.BSSID); 15809831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen } 15819831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen if (validBssid) { 15829831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen ANQPNetworkKey uniqueEss = ANQPNetworkKey.buildKey(scanResult.SSID, bssid, 15839831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen scanResult.hessid, networkDetail.getAnqpDomainID()); 15849831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R1) { 15859831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen Integer countObj = passpointR1UniqueEss.get(uniqueEss); 15869831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen int count = countObj == null ? 0 : countObj; 15879831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen passpointR1UniqueEss.put(uniqueEss, count + 1); 15889831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen } else if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R2) { 15899831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen Integer countObj = passpointR2UniqueEss.get(uniqueEss); 15909831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen int count = countObj == null ? 0 : countObj; 15919831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen passpointR2UniqueEss.put(uniqueEss, count + 1); 15929831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen } 15939831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen } 15949831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen 159508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 1596533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen 1597533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen if (mWifiNetworkSelector.isSignalTooWeak(scanResult)) { 1598533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen continue; 1599533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen } 1600533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen 1601533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen // statistics to be collected ONLY for those APs with sufficient signal power 1602533e7436021769b3582a230b0622fd44bfcc7cf2Etan Cohen 160308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne ssids.add(matchInfo); 160408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne bssids++; 160508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne boolean isOpen = matchInfo.networkType == ScanResultMatchInfo.NETWORK_TYPE_OPEN; 160608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne WifiConfiguration config = 160708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mWifiConfigManager.getConfiguredNetworkForScanDetail(scanDetail); 160808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne boolean isSaved = (config != null) && !config.isEphemeral() 160908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne && !config.isPasspoint(); 161008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne boolean isSavedPasspoint = passpointProvider != null; 161108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne if (isOpen) { 161208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne openSsids.add(matchInfo); 161308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne openBssids++; 161408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 161508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne if (isSaved) { 161608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne savedSsids.add(matchInfo); 161708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne savedBssids++; 161808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 161908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne if (isOpen || isSaved) { 162008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne openOrSavedBssids++; 162108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne // Calculate openOrSavedSsids union later 162208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 162308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne if (isSavedPasspoint) { 162408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne savedPasspointProviderProfiles.add(passpointProvider); 162508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne savedPasspointProviderBssids++; 162608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 162708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 162808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mWifiLogProto.fullBandAllSingleScanListenerResults++; 162908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne incrementTotalScanSsids(mTotalSsidsInScanHistogram, ssids.size()); 163008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne incrementTotalScanResults(mTotalBssidsInScanHistogram, bssids); 163108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne incrementSsid(mAvailableOpenSsidsInScanHistogram, openSsids.size()); 163208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne incrementBssid(mAvailableOpenBssidsInScanHistogram, openBssids); 163308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne incrementSsid(mAvailableSavedSsidsInScanHistogram, savedSsids.size()); 163408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne incrementBssid(mAvailableSavedBssidsInScanHistogram, savedBssids); 163508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne openSsids.addAll(savedSsids); // openSsids = Union(openSsids, savedSsids) 163608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne incrementSsid(mAvailableOpenOrSavedSsidsInScanHistogram, openSsids.size()); 163708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne incrementBssid(mAvailableOpenOrSavedBssidsInScanHistogram, openOrSavedBssids); 163808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne incrementSsid(mAvailableSavedPasspointProviderProfilesInScanHistogram, 163908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne savedPasspointProviderProfiles.size()); 164008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne incrementBssid(mAvailableSavedPasspointProviderBssidsInScanHistogram, 164108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne savedPasspointProviderBssids); 16429831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen incrementTotalPasspointAps(mObservedHotspotR1ApInScanHistogram, passpointR1Aps); 16439831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen incrementTotalPasspointAps(mObservedHotspotR2ApInScanHistogram, passpointR2Aps); 16449831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen incrementTotalUniquePasspointEss(mObservedHotspotR1EssInScanHistogram, 16459831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen passpointR1UniqueEss.size()); 16469831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen incrementTotalUniquePasspointEss(mObservedHotspotR2EssInScanHistogram, 16479831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen passpointR2UniqueEss.size()); 16489831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen for (Integer count : passpointR1UniqueEss.values()) { 16499831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen incrementPasspointPerUniqueEss(mObservedHotspotR1ApsPerEssInScanHistogram, count); 16509831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen } 16519831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen for (Integer count : passpointR2UniqueEss.values()) { 16529831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen incrementPasspointPerUniqueEss(mObservedHotspotR2ApsPerEssInScanHistogram, count); 16539831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen } 1654973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen increment80211mcAps(mObserved80211mcApInScanHistogram, supporting80211mcAps); 165508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 165608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 165708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne 1658054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh /** 1659054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh * TODO: (b/72443859) Use notifierTag param to separate metrics for OpenNetworkNotifier and 1660054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh * CarrierNetworkNotifier, for this method and all other related metrics. 1661054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh */ 1662a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen /** Increments the occurence of a "Connect to Network" notification. */ 1663054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh public void incrementConnectToNetworkNotification(String notifierTag, int notificationType) { 1664a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen synchronized (mLock) { 1665a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen int count = mConnectToNetworkNotificationCount.get(notificationType); 1666a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen mConnectToNetworkNotificationCount.put(notificationType, count + 1); 1667a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen } 1668a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen } 1669a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen 1670a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen /** Increments the occurence of an "Connect to Network" notification user action. */ 1671054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh public void incrementConnectToNetworkNotificationAction(String notifierTag, 1672054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh int notificationType, int actionType) { 1673a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen synchronized (mLock) { 1674a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen int key = notificationType * CONNECT_TO_NETWORK_NOTIFICATION_ACTION_KEY_MULTIPLIER 1675a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen + actionType; 1676a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen int count = mConnectToNetworkNotificationActionCount.get(key); 1677a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen mConnectToNetworkNotificationActionCount.put(key, count + 1); 1678a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen } 1679a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen } 1680a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen 1681a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen /** 1682a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen * Sets the number of SSIDs blacklisted from recommendation by the open network notification 1683a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen * recommender. 1684a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen */ 1685054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh public void setNetworkRecommenderBlacklistSize(String notifierTag, int size) { 1686a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen synchronized (mLock) { 1687a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen mOpenNetworkRecommenderBlacklistSize = size; 1688a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen } 1689a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen } 1690a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen 1691a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen /** Sets if the available network notification feature is enabled. */ 1692054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh public void setIsWifiNetworksAvailableNotificationEnabled(String notifierTag, boolean enabled) { 1693a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen synchronized (mLock) { 1694a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen mIsWifiNetworksAvailableNotificationOn = enabled; 1695a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen } 1696a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen } 1697a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen 1698a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen /** Increments the occurence of connection attempts that were initiated unsuccessfully */ 1699054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh public void incrementNumNetworkRecommendationUpdates(String notifierTag) { 1700a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen synchronized (mLock) { 1701a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen mNumOpenNetworkRecommendationUpdates++; 1702a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen } 1703a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen } 1704a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen 1705a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen /** Increments the occurence of connection attempts that were initiated unsuccessfully */ 1706054fa81a3efcadcdee416fb7998139d9aa55b719Mehdi Alizadeh public void incrementNumNetworkConnectMessageFailedToSend(String notifierTag) { 1707a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen synchronized (mLock) { 1708a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen mNumOpenNetworkConnectMessageFailedToSend++; 1709a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen } 1710a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen } 1711a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen 171228a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim /** Sets if Connected MAC Randomization feature is enabled */ 171328a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim public void setIsMacRandomizationOn(boolean enabled) { 171428a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim synchronized (mLock) { 171528a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim mIsMacRandomizationOn = enabled; 171628a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim } 171728a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim } 171828a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim 171911638f348ba45f9f417928e79b81186cef76c561Glen Kuhne public static final String PROTO_DUMP_ARG = "wifiMetricsProto"; 17209ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne public static final String CLEAN_DUMP_ARG = "clean"; 17219ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne 17221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 17231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Dump all WifiMetrics. Collects some metrics from ConfigStore, Settings and WifiManager 17249ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne * at this time. 17251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 17261b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param fd unused 17271b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param pw PrintWriter for writing dump to 17281b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param args unused 17291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 17301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 17311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 1732031cdffdaf223772d4ea52569ec7a08d00013208Glen Kuhne if (args != null && args.length > 0 && PROTO_DUMP_ARG.equals(args[0])) { 17339ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne // Dump serialized WifiLog proto 17341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne consolidateProto(true); 17351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne for (ConnectionEvent event : mConnectionEventList) { 17361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne if (mCurrentConnectionEvent != event) { 17371b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne //indicate that automatic bug report has been taken for all valid 17381b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne //connection events 17391b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne event.mConnectionEvent.automaticBugReportTaken = true; 17401b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 17411b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 17421b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne byte[] wifiMetricsProto = WifiMetricsProto.WifiLog.toByteArray(mWifiLogProto); 17431b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne String metricsProtoDump = Base64.encodeToString(wifiMetricsProto, Base64.DEFAULT); 17449ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne if (args.length > 1 && CLEAN_DUMP_ARG.equals(args[1])) { 17459ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne // Output metrics proto bytes (base64) and nothing else 17469ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne pw.print(metricsProtoDump); 17479ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne } else { 17489ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne // Tag the start and end of the metrics proto bytes 17499ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne pw.println("WifiMetrics:"); 17509ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne pw.println(metricsProtoDump); 17519ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne pw.println("EndWifiMetrics"); 17529ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne } 17532532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne clear(); 17541b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } else { 17559ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne pw.println("WifiMetrics:"); 17561b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mConnectionEvents:"); 17571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne for (ConnectionEvent event : mConnectionEventList) { 17581b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne String eventLine = event.toString(); 17591b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne if (event == mCurrentConnectionEvent) { 17601b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne eventLine += "CURRENTLY OPEN EVENT"; 17611b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 17621b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println(eventLine); 17631b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 17641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mWifiLogProto.numSavedNetworks=" + mWifiLogProto.numSavedNetworks); 17651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mWifiLogProto.numOpenNetworks=" + mWifiLogProto.numOpenNetworks); 17661b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mWifiLogProto.numPersonalNetworks=" 17671b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne + mWifiLogProto.numPersonalNetworks); 17681b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mWifiLogProto.numEnterpriseNetworks=" 17691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne + mWifiLogProto.numEnterpriseNetworks); 177059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numHiddenNetworks=" + mWifiLogProto.numHiddenNetworks); 177159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numPasspointNetworks=" 177259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numPasspointNetworks); 17731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mWifiLogProto.isLocationEnabled=" + mWifiLogProto.isLocationEnabled); 17741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mWifiLogProto.isScanningAlwaysEnabled=" 17751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne + mWifiLogProto.isScanningAlwaysEnabled); 1776c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mWifiLogProto.numNetworksAddedByUser=" 1777c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + mWifiLogProto.numNetworksAddedByUser); 1778c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mWifiLogProto.numNetworksAddedByApps=" 1779c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + mWifiLogProto.numNetworksAddedByApps); 1780c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mWifiLogProto.numNonEmptyScanResults=" 1781c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + mWifiLogProto.numNonEmptyScanResults); 1782c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mWifiLogProto.numEmptyScanResults=" 1783c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + mWifiLogProto.numEmptyScanResults); 1784424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang pw.println("mWifiLogProto.numConnecitvityOneshotScans=" 1785424fb3017e6c856ca70a65011fc693268cce77e1Ningyuan Wang + mWifiLogProto.numConnectivityOneshotScans); 1786c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mWifiLogProto.numOneshotScans=" 1787c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + mWifiLogProto.numOneshotScans); 1788c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mWifiLogProto.numBackgroundScans=" 1789c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + mWifiLogProto.numBackgroundScans); 179005a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius pw.println("mWifiLogProto.numExternalAppOneshotScanRequests=" 179105a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius + mWifiLogProto.numExternalAppOneshotScanRequests); 179205a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius pw.println("mWifiLogProto.numExternalForegroundAppOneshotScanRequestsThrottled=" 179305a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius + mWifiLogProto.numExternalForegroundAppOneshotScanRequestsThrottled); 179405a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius pw.println("mWifiLogProto.numExternalBackgroundAppOneshotScanRequestsThrottled=" 179505a370d9aede8f307a10a8c27fa17e18240aa8d8Roshan Pius + mWifiLogProto.numExternalBackgroundAppOneshotScanRequestsThrottled); 1796c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 1797c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mScanReturnEntries:"); 1798c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" SCAN_UNKNOWN: " + getScanReturnEntry( 1799c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne WifiMetricsProto.WifiLog.SCAN_UNKNOWN)); 1800c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" SCAN_SUCCESS: " + getScanReturnEntry( 1801c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne WifiMetricsProto.WifiLog.SCAN_SUCCESS)); 1802c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" SCAN_FAILURE_INTERRUPTED: " + getScanReturnEntry( 1803c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne WifiMetricsProto.WifiLog.SCAN_FAILURE_INTERRUPTED)); 1804c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" SCAN_FAILURE_INVALID_CONFIGURATION: " + getScanReturnEntry( 1805c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne WifiMetricsProto.WifiLog.SCAN_FAILURE_INVALID_CONFIGURATION)); 1806c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" FAILURE_WIFI_DISABLED: " + getScanReturnEntry( 1807c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne WifiMetricsProto.WifiLog.FAILURE_WIFI_DISABLED)); 1808c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 1809c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mSystemStateEntries: <state><screenOn> : <scansInitiated>"); 1810c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_UNKNOWN ON: " 1811c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_UNKNOWN, true)); 1812c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_DISABLED ON: " 1813c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISABLED, true)); 1814c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_DISCONNECTED ON: " 1815c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISCONNECTED, true)); 1816c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_ASSOCIATED ON: " 1817c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_ASSOCIATED, true)); 1818c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_UNKNOWN OFF: " 1819c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_UNKNOWN, false)); 1820c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_DISABLED OFF: " 1821c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISABLED, false)); 1822c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_DISCONNECTED OFF: " 1823c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISCONNECTED, false)); 1824c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_ASSOCIATED OFF: " 1825c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_ASSOCIATED, false)); 1826ce003b812aead64dcb36647180991150021b24c1Glen Kuhne pw.println("mWifiLogProto.numConnectivityWatchdogPnoGood=" 1827ce003b812aead64dcb36647180991150021b24c1Glen Kuhne + mWifiLogProto.numConnectivityWatchdogPnoGood); 1828ce003b812aead64dcb36647180991150021b24c1Glen Kuhne pw.println("mWifiLogProto.numConnectivityWatchdogPnoBad=" 1829ce003b812aead64dcb36647180991150021b24c1Glen Kuhne + mWifiLogProto.numConnectivityWatchdogPnoBad); 1830ce003b812aead64dcb36647180991150021b24c1Glen Kuhne pw.println("mWifiLogProto.numConnectivityWatchdogBackgroundGood=" 1831ce003b812aead64dcb36647180991150021b24c1Glen Kuhne + mWifiLogProto.numConnectivityWatchdogBackgroundGood); 1832ce003b812aead64dcb36647180991150021b24c1Glen Kuhne pw.println("mWifiLogProto.numConnectivityWatchdogBackgroundBad=" 1833ce003b812aead64dcb36647180991150021b24c1Glen Kuhne + mWifiLogProto.numConnectivityWatchdogBackgroundBad); 18345f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogTriggers=" 18355f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogTriggers); 18365f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal=" 18375f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal); 18385f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal=" 18395f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal); 18405f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal=" 18415f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal); 18425f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal=" 18435f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal); 18445f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal=" 18455f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal); 18465f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation=" 18475f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation); 18485f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication=" 18495f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication); 18505f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp=" 18515f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp); 18525f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadOther=" 18535f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogTriggersWithBadOther); 1854da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogSuccesses=" 1855da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne + mWifiLogProto.numLastResortWatchdogSuccesses); 1856107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne pw.println("mWifiLogProto.recordDurationSec=" 1857107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne + ((mClock.getElapsedSinceBootMillis() / 1000) - mRecordStartTimeSec)); 18587a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne pw.println("mWifiLogProto.rssiPollRssiCount: Printing counts for [" + MIN_RSSI_POLL 18597a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne + ", " + MAX_RSSI_POLL + "]"); 18607a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne StringBuilder sb = new StringBuilder(); 18617a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne for (int i = MIN_RSSI_POLL; i <= MAX_RSSI_POLL; i++) { 18627a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne sb.append(mRssiPollCounts.get(i) + " "); 18637a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne } 18647a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne pw.println(" " + sb.toString()); 18655cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne pw.println("mWifiLogProto.rssiPollDeltaCount: Printing counts for [" 18665cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne + MIN_RSSI_DELTA + ", " + MAX_RSSI_DELTA + "]"); 18675cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne sb.setLength(0); 18685cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne for (int i = MIN_RSSI_DELTA; i <= MAX_RSSI_DELTA; i++) { 18695cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne sb.append(mRssiDeltaCounts.get(i) + " "); 18705cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 18715cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne pw.println(" " + sb.toString()); 1872f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal pw.print("mWifiLogProto.alertReasonCounts="); 1873f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal sb.setLength(0); 1874f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal for (int i = WifiLoggerHal.WIFI_ALERT_REASON_MIN; 1875f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal i <= WifiLoggerHal.WIFI_ALERT_REASON_MAX; i++) { 1876f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal int count = mWifiAlertReasonCounts.get(i); 1877f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal if (count > 0) { 1878f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal sb.append("(" + i + "," + count + "),"); 1879f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 1880f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 1881f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal if (sb.length() > 1) { 1882f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal sb.setLength(sb.length() - 1); // strip trailing comma 1883f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal pw.println(sb.toString()); 1884f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } else { 1885f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal pw.println("()"); 1886f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 188759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numTotalScanResults=" 188859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numTotalScanResults); 188959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numOpenNetworkScanResults=" 189059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numOpenNetworkScanResults); 189159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numPersonalNetworkScanResults=" 189259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numPersonalNetworkScanResults); 189359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numEnterpriseNetworkScanResults=" 189459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numEnterpriseNetworkScanResults); 189559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numHiddenNetworkScanResults=" 189659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numHiddenNetworkScanResults); 189759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numHotspot2R1NetworkScanResults=" 189859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numHotspot2R1NetworkScanResults); 189959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numHotspot2R2NetworkScanResults=" 190059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numHotspot2R2NetworkScanResults); 190159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numScans=" + mWifiLogProto.numScans); 19024569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao pw.println("mWifiLogProto.WifiScoreCount: [" + MIN_WIFI_SCORE + ", " 19034569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao + MAX_WIFI_SCORE + "]"); 19044569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao for (int i = 0; i <= MAX_WIFI_SCORE; i++) { 19054569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao pw.print(mWifiScoreCounts.get(i) + " "); 19064569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao } 190744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein pw.println(); // add a line after wifi scores 190844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein pw.println("mWifiLogProto.SoftApManagerReturnCodeCounts:"); 190944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein pw.println(" SUCCESS: " + mSoftApManagerReturnCodeCounts.get( 191044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_STARTED_SUCCESSFULLY)); 191144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein pw.println(" FAILED_GENERAL_ERROR: " + mSoftApManagerReturnCodeCounts.get( 191244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_GENERAL_ERROR)); 191344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein pw.println(" FAILED_NO_CHANNEL: " + mSoftApManagerReturnCodeCounts.get( 191444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_NO_CHANNEL)); 19154569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao pw.print("\n"); 1916bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius pw.println("mWifiLogProto.numHalCrashes=" 1917bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius + mWifiLogProto.numHalCrashes); 1918bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius pw.println("mWifiLogProto.numWificondCrashes=" 1919bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius + mWifiLogProto.numWificondCrashes); 192065a9143d6c93624837da3867f1cadf2daab62236Roshan Pius pw.println("mWifiLogProto.numSupplicantCrashes=" 192165a9143d6c93624837da3867f1cadf2daab62236Roshan Pius + mWifiLogProto.numSupplicantCrashes); 192265a9143d6c93624837da3867f1cadf2daab62236Roshan Pius pw.println("mWifiLogProto.numHostapdCrashes=" 192365a9143d6c93624837da3867f1cadf2daab62236Roshan Pius + mWifiLogProto.numHostapdCrashes); 19245ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius pw.println("mWifiLogProto.numSetupClientInterfaceFailureDueToHal=" 19255ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius + mWifiLogProto.numSetupClientInterfaceFailureDueToHal); 19265ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius pw.println("mWifiLogProto.numSetupClientInterfaceFailureDueToWificond=" 19275ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius + mWifiLogProto.numSetupClientInterfaceFailureDueToWificond); 19285ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius pw.println("mWifiLogProto.numSetupClientInterfaceFailureDueToSupplicant=" 19295ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius + mWifiLogProto.numSetupClientInterfaceFailureDueToSupplicant); 19305ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius pw.println("mWifiLogProto.numSetupSoftApInterfaceFailureDueToHal=" 19315ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius + mWifiLogProto.numSetupSoftApInterfaceFailureDueToHal); 19325ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius pw.println("mWifiLogProto.numSetupSoftApInterfaceFailureDueToWificond=" 19335ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius + mWifiLogProto.numSetupSoftApInterfaceFailureDueToWificond); 19345ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius pw.println("mWifiLogProto.numSetupSoftApInterfaceFailureDueToHostapd=" 19355ed6b02a8435874d16a4ef3decc8df1b7e07f852Roshan Pius + mWifiLogProto.numSetupSoftApInterfaceFailureDueToHostapd); 193646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne pw.println("StaEventList:"); 1937d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne for (StaEventWithTime event : mStaEventList) { 1938d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne pw.println(event); 193946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 1940910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen 194126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu pw.println("mWifiLogProto.numPasspointProviders=" 194226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu + mWifiLogProto.numPasspointProviders); 194326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu pw.println("mWifiLogProto.numPasspointProviderInstallation=" 194426b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu + mWifiLogProto.numPasspointProviderInstallation); 194526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu pw.println("mWifiLogProto.numPasspointProviderInstallSuccess=" 194626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu + mWifiLogProto.numPasspointProviderInstallSuccess); 194726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu pw.println("mWifiLogProto.numPasspointProviderUninstallation=" 194826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu + mWifiLogProto.numPasspointProviderUninstallation); 194926b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu pw.println("mWifiLogProto.numPasspointProviderUninstallSuccess=" 195026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu + mWifiLogProto.numPasspointProviderUninstallSuccess); 195126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu pw.println("mWifiLogProto.numPasspointProvidersSuccessfullyConnected=" 195226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu + mWifiLogProto.numPasspointProvidersSuccessfullyConnected); 195308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne pw.println("mTotalSsidsInScanHistogram:" 195408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne + mTotalSsidsInScanHistogram.toString()); 195508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne pw.println("mTotalBssidsInScanHistogram:" 195608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne + mTotalBssidsInScanHistogram.toString()); 195708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne pw.println("mAvailableOpenSsidsInScanHistogram:" 195808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne + mAvailableOpenSsidsInScanHistogram.toString()); 195908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne pw.println("mAvailableOpenBssidsInScanHistogram:" 196008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne + mAvailableOpenBssidsInScanHistogram.toString()); 196108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne pw.println("mAvailableSavedSsidsInScanHistogram:" 196208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne + mAvailableSavedSsidsInScanHistogram.toString()); 196308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne pw.println("mAvailableSavedBssidsInScanHistogram:" 196408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne + mAvailableSavedBssidsInScanHistogram.toString()); 196508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne pw.println("mAvailableOpenOrSavedSsidsInScanHistogram:" 196608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne + mAvailableOpenOrSavedSsidsInScanHistogram.toString()); 196708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne pw.println("mAvailableOpenOrSavedBssidsInScanHistogram:" 196808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne + mAvailableOpenOrSavedBssidsInScanHistogram.toString()); 196908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne pw.println("mAvailableSavedPasspointProviderProfilesInScanHistogram:" 197008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne + mAvailableSavedPasspointProviderProfilesInScanHistogram.toString()); 197108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne pw.println("mAvailableSavedPasspointProviderBssidsInScanHistogram:" 197208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne + mAvailableSavedPasspointProviderBssidsInScanHistogram.toString()); 197308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne pw.println("mWifiLogProto.partialAllSingleScanListenerResults=" 197408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne + mWifiLogProto.partialAllSingleScanListenerResults); 197508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne pw.println("mWifiLogProto.fullBandAllSingleScanListenerResults=" 197608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne + mWifiLogProto.fullBandAllSingleScanListenerResults); 1977910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen pw.println("mWifiAwareMetrics:"); 1978910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen mWifiAwareMetrics.dump(fd, pw, args); 197902e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen pw.println("mRttMetrics:"); 198002e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen mRttMetrics.dump(fd, pw, args); 1981a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh 1982a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh pw.println("mPnoScanMetrics.numPnoScanAttempts=" 1983a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh + mPnoScanMetrics.numPnoScanAttempts); 1984a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh pw.println("mPnoScanMetrics.numPnoScanFailed=" 1985a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh + mPnoScanMetrics.numPnoScanFailed); 1986a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh pw.println("mPnoScanMetrics.numPnoScanStartedOverOffload=" 1987a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh + mPnoScanMetrics.numPnoScanStartedOverOffload); 1988a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh pw.println("mPnoScanMetrics.numPnoScanFailedOverOffload=" 1989a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh + mPnoScanMetrics.numPnoScanFailedOverOffload); 1990a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh pw.println("mPnoScanMetrics.numPnoFoundNetworkEvents=" 1991a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh + mPnoScanMetrics.numPnoFoundNetworkEvents); 1992a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen 1993a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen pw.println("mWifiLogProto.connectToNetworkNotificationCount=" 1994a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen + mConnectToNetworkNotificationCount.toString()); 1995a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen pw.println("mWifiLogProto.connectToNetworkNotificationActionCount=" 1996a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen + mConnectToNetworkNotificationActionCount.toString()); 1997a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen pw.println("mWifiLogProto.openNetworkRecommenderBlacklistSize=" 1998a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen + mOpenNetworkRecommenderBlacklistSize); 1999a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen pw.println("mWifiLogProto.isWifiNetworksAvailableNotificationOn=" 2000a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen + mIsWifiNetworksAvailableNotificationOn); 2001a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen pw.println("mWifiLogProto.numOpenNetworkRecommendationUpdates=" 2002a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen + mNumOpenNetworkRecommendationUpdates); 2003a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen pw.println("mWifiLogProto.numOpenNetworkConnectMessageFailedToSend=" 2004a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen + mNumOpenNetworkConnectMessageFailedToSend); 20059831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen 20069831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen pw.println("mWifiLogProto.observedHotspotR1ApInScanHistogram=" 20079831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen + mObservedHotspotR1ApInScanHistogram); 20089831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen pw.println("mWifiLogProto.observedHotspotR2ApInScanHistogram=" 20099831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen + mObservedHotspotR2ApInScanHistogram); 20109831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen pw.println("mWifiLogProto.observedHotspotR1EssInScanHistogram=" 20119831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen + mObservedHotspotR1EssInScanHistogram); 20129831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen pw.println("mWifiLogProto.observedHotspotR2EssInScanHistogram=" 20139831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen + mObservedHotspotR2EssInScanHistogram); 20149831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen pw.println("mWifiLogProto.observedHotspotR1ApsPerEssInScanHistogram=" 20159831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen + mObservedHotspotR1ApsPerEssInScanHistogram); 20169831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen pw.println("mWifiLogProto.observedHotspotR2ApsPerEssInScanHistogram=" 20179831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen + mObservedHotspotR2ApsPerEssInScanHistogram); 201805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh 2019973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen pw.println("mWifiLogProto.observed80211mcSupportingApsInScanHistogram" 2020973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen + mObserved80211mcApInScanHistogram); 2021973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen 202205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh pw.println("mSoftApTetheredEvents:"); 202305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh for (SoftApConnectedClientsEvent event : mSoftApEventListTethered) { 202405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh StringBuilder eventLine = new StringBuilder(); 202505ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh eventLine.append("event_type=" + event.eventType); 202605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh eventLine.append(",time_stamp_millis=" + event.timeStampMillis); 202705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh eventLine.append(",num_connected_clients=" + event.numConnectedClients); 20284de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh eventLine.append(",channel_frequency=" + event.channelFrequency); 20294de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh eventLine.append(",channel_bandwidth=" + event.channelBandwidth); 203005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh pw.println(eventLine.toString()); 203105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh } 203205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh pw.println("mSoftApLocalOnlyEvents:"); 203305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh for (SoftApConnectedClientsEvent event : mSoftApEventListLocalOnly) { 203405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh StringBuilder eventLine = new StringBuilder(); 203505ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh eventLine.append("event_type=" + event.eventType); 203605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh eventLine.append(",time_stamp_millis=" + event.timeStampMillis); 203705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh eventLine.append(",num_connected_clients=" + event.numConnectedClients); 20384de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh eventLine.append(",channel_frequency=" + event.channelFrequency); 20394de36821d74eb8980c49a0f79c20343591b12e27Mehdi Alizadeh eventLine.append(",channel_bandwidth=" + event.channelBandwidth); 204005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh pw.println(eventLine.toString()); 204105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh } 204262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim 204362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim pw.println("mWpsMetrics.numWpsAttempts=" 204462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim + mWpsMetrics.numWpsAttempts); 204562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim pw.println("mWpsMetrics.numWpsSuccess=" 204662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim + mWpsMetrics.numWpsSuccess); 204762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim pw.println("mWpsMetrics.numWpsStartFailure=" 204862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim + mWpsMetrics.numWpsStartFailure); 204962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim pw.println("mWpsMetrics.numWpsOverlapFailure=" 205062344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim + mWpsMetrics.numWpsOverlapFailure); 205162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim pw.println("mWpsMetrics.numWpsTimeoutFailure=" 205262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim + mWpsMetrics.numWpsTimeoutFailure); 205362344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim pw.println("mWpsMetrics.numWpsOtherConnectionFailure=" 205462344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim + mWpsMetrics.numWpsOtherConnectionFailure); 205562344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim pw.println("mWpsMetrics.numWpsSupplicantFailure=" 205662344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim + mWpsMetrics.numWpsSupplicantFailure); 205762344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim pw.println("mWpsMetrics.numWpsCancellation=" 205862344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim + mWpsMetrics.numWpsCancellation); 2059fb165562c8c77a9e5e2452f33aedb8e4369e7a9bSiddharth Ray 2060fb165562c8c77a9e5e2452f33aedb8e4369e7a9bSiddharth Ray mWifiPowerMetrics.dump(pw); 206112d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach mWifiWakeMetrics.dump(pw); 206228a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim 206328a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim pw.println("mWifiLogProto.isMacRandomizationOn=" + mIsMacRandomizationOn); 20641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 20651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 20661b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 20671b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 20683c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne /** 20693c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne * Update various counts of saved network types 20703c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne * @param networks List of WifiConfigurations representing all saved networks, must not be null 20713c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne */ 20723c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne public void updateSavedNetworks(List<WifiConfiguration> networks) { 20733c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne synchronized (mLock) { 20743c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numSavedNetworks = networks.size(); 20753c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numOpenNetworks = 0; 20763c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numPersonalNetworks = 0; 20773c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numEnterpriseNetworks = 0; 20783c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numNetworksAddedByUser = 0; 20793c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numNetworksAddedByApps = 0; 20803c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numHiddenNetworks = 0; 20813c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numPasspointNetworks = 0; 20823c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne for (WifiConfiguration config : networks) { 20833c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne if (config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.NONE)) { 20843c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numOpenNetworks++; 20853c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } else if (config.isEnterprise()) { 20863c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numEnterpriseNetworks++; 20873c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } else { 20883c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numPersonalNetworks++; 20893c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } 20903c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne if (config.selfAdded) { 20913c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numNetworksAddedByUser++; 20923c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } else { 20933c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numNetworksAddedByApps++; 20943c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } 20953c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne if (config.hiddenSSID) { 20963c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numHiddenNetworks++; 20973c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } 20983c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne if (config.isPasspoint()) { 20993c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numPasspointNetworks++; 21003c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } 21013c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } 21023c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } 21033c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } 21043c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne 21051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 210649357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu * Update metrics for saved Passpoint profiles. 210726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu * 210826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu * @param numSavedProfiles The number of saved Passpoint profiles 210949357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu * @param numConnectedProfiles The number of saved Passpoint profiles that have ever resulted 211049357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu * in a successful network connection 211126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu */ 211249357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu public void updateSavedPasspointProfiles(int numSavedProfiles, int numConnectedProfiles) { 211326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu synchronized (mLock) { 211426b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu mWifiLogProto.numPasspointProviders = numSavedProfiles; 211549357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu mWifiLogProto.numPasspointProvidersSuccessfullyConnected = numConnectedProfiles; 211626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu } 211726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu } 211826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu 211926b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu /** 2120c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * append the separate ConnectionEvent, SystemStateEntry and ScanReturnCode collections to their 2121c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * respective lists within mWifiLogProto 21221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 21231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param incremental Only include ConnectionEvents created since last automatic bug report 21241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 21251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private void consolidateProto(boolean incremental) { 21261b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne List<WifiMetricsProto.ConnectionEvent> events = new ArrayList<>(); 21277a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne List<WifiMetricsProto.RssiPollCount> rssis = new ArrayList<>(); 21285cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne List<WifiMetricsProto.RssiPollCount> rssiDeltas = new ArrayList<>(); 2129f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal List<WifiMetricsProto.AlertReasonCount> alertReasons = new ArrayList<>(); 21304569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao List<WifiMetricsProto.WifiScoreCount> scores = new ArrayList<>(); 21311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 21321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne for (ConnectionEvent event : mConnectionEventList) { 2133c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne // If this is not incremental, dump full ConnectionEvent list 2134c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne // Else Dump all un-dumped events except for the current one 21351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne if (!incremental || ((mCurrentConnectionEvent != event) 21361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne && !event.mConnectionEvent.automaticBugReportTaken)) { 21371b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne //Get all ConnectionEvents that haven not been dumped as a proto, also exclude 21381b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne //the current active un-ended connection event 21391b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne events.add(event.mConnectionEvent); 2140c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (incremental) { 2141c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne event.mConnectionEvent.automaticBugReportTaken = true; 2142c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 21431b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 21441b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 21451b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne if (events.size() > 0) { 21461b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.connectionEvent = events.toArray(mWifiLogProto.connectionEvent); 21471b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 2148c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 2149c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne //Convert the SparseIntArray of scanReturnEntry integers into ScanReturnEntry proto list 2150c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.scanReturnEntries = 2151c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne new WifiMetricsProto.WifiLog.ScanReturnEntry[mScanReturnEntries.size()]; 2152c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne for (int i = 0; i < mScanReturnEntries.size(); i++) { 2153c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.scanReturnEntries[i] = new WifiMetricsProto.WifiLog.ScanReturnEntry(); 2154c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.scanReturnEntries[i].scanReturnCode = mScanReturnEntries.keyAt(i); 2155c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.scanReturnEntries[i].scanResultsCount = mScanReturnEntries.valueAt(i); 2156c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 2157c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 2158c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne // Convert the SparseIntArray of systemStateEntry into WifiSystemStateEntry proto list 2159c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne // This one is slightly more complex, as the Sparse are indexed with: 2160c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne // key: wifiState * 2 + isScreenOn, value: wifiStateCount 2161c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.wifiSystemStateEntries = 2162c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne new WifiMetricsProto.WifiLog 2163c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne .WifiSystemStateEntry[mWifiSystemStateEntries.size()]; 2164c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne for (int i = 0; i < mWifiSystemStateEntries.size(); i++) { 2165c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.wifiSystemStateEntries[i] = 2166c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne new WifiMetricsProto.WifiLog.WifiSystemStateEntry(); 2167c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.wifiSystemStateEntries[i].wifiState = 2168c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiSystemStateEntries.keyAt(i) / 2; 2169c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.wifiSystemStateEntries[i].wifiStateCount = 2170c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiSystemStateEntries.valueAt(i); 2171c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.wifiSystemStateEntries[i].isScreenOn = 2172c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne (mWifiSystemStateEntries.keyAt(i) % 2) > 0; 2173c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 2174107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne mWifiLogProto.recordDurationSec = (int) ((mClock.getElapsedSinceBootMillis() / 1000) 2175107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne - mRecordStartTimeSec); 21767a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne 21777a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne /** 21787a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne * Convert the SparseIntArray of RSSI poll rssi's and counts to the proto's repeated 21797a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne * IntKeyVal array. 21807a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne */ 21817a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne for (int i = 0; i < mRssiPollCounts.size(); i++) { 21827a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne WifiMetricsProto.RssiPollCount keyVal = new WifiMetricsProto.RssiPollCount(); 21837a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne keyVal.rssi = mRssiPollCounts.keyAt(i); 21847a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne keyVal.count = mRssiPollCounts.valueAt(i); 21857a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne rssis.add(keyVal); 21867a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne } 21877a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne mWifiLogProto.rssiPollRssiCount = rssis.toArray(mWifiLogProto.rssiPollRssiCount); 2188f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal 2189f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal /** 21905cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * Convert the SparseIntArray of RSSI delta rssi's and counts to the proto's repeated 21915cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * IntKeyVal array. 21925cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne */ 21935cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne for (int i = 0; i < mRssiDeltaCounts.size(); i++) { 21945cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne WifiMetricsProto.RssiPollCount keyVal = new WifiMetricsProto.RssiPollCount(); 21955cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne keyVal.rssi = mRssiDeltaCounts.keyAt(i); 21965cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne keyVal.count = mRssiDeltaCounts.valueAt(i); 21975cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne rssiDeltas.add(keyVal); 21985cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 21995cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mWifiLogProto.rssiPollDeltaCount = rssiDeltas.toArray(mWifiLogProto.rssiPollDeltaCount); 22005cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne 22015cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne /** 2202f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal * Convert the SparseIntArray of alert reasons and counts to the proto's repeated 2203f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal * IntKeyVal array. 2204f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal */ 2205f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal for (int i = 0; i < mWifiAlertReasonCounts.size(); i++) { 2206f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal WifiMetricsProto.AlertReasonCount keyVal = new WifiMetricsProto.AlertReasonCount(); 2207f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal keyVal.reason = mWifiAlertReasonCounts.keyAt(i); 2208f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal keyVal.count = mWifiAlertReasonCounts.valueAt(i); 2209f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal alertReasons.add(keyVal); 2210f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 2211f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal mWifiLogProto.alertReasonCount = alertReasons.toArray(mWifiLogProto.alertReasonCount); 22124569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao 22134569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao /** 22144569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao * Convert the SparseIntArray of Wifi Score and counts to proto's repeated 22154569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao * IntKeyVal array. 22164569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao */ 22174569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao for (int score = 0; score < mWifiScoreCounts.size(); score++) { 22184569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao WifiMetricsProto.WifiScoreCount keyVal = new WifiMetricsProto.WifiScoreCount(); 22194569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao keyVal.score = mWifiScoreCounts.keyAt(score); 22204569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao keyVal.count = mWifiScoreCounts.valueAt(score); 22214569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao scores.add(keyVal); 22224569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao } 22234569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao mWifiLogProto.wifiScoreCount = scores.toArray(mWifiLogProto.wifiScoreCount); 222444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein 222544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein /** 222644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein * Convert the SparseIntArray of SoftAp Return codes and counts to proto's repeated 222744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein * IntKeyVal array. 222844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein */ 222944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein int codeCounts = mSoftApManagerReturnCodeCounts.size(); 223044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mWifiLogProto.softApReturnCode = new WifiMetricsProto.SoftApReturnCodeCount[codeCounts]; 223144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein for (int sapCode = 0; sapCode < codeCounts; sapCode++) { 223244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mWifiLogProto.softApReturnCode[sapCode] = 223344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein new WifiMetricsProto.SoftApReturnCodeCount(); 223444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mWifiLogProto.softApReturnCode[sapCode].startResult = 223544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mSoftApManagerReturnCodeCounts.keyAt(sapCode); 223644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mWifiLogProto.softApReturnCode[sapCode].count = 223744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mSoftApManagerReturnCodeCounts.valueAt(sapCode); 223844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein } 2239d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne 2240d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne /** 2241d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne * Convert StaEventList to array of StaEvents 2242d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne */ 2243d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne mWifiLogProto.staEventList = new StaEvent[mStaEventList.size()]; 2244d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne for (int i = 0; i < mStaEventList.size(); i++) { 2245d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne mWifiLogProto.staEventList[i] = mStaEventList.get(i).staEvent; 2246d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne } 224708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mWifiLogProto.totalSsidsInScanHistogram = 224808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne makeNumConnectableNetworksBucketArray(mTotalSsidsInScanHistogram); 224908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mWifiLogProto.totalBssidsInScanHistogram = 225008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne makeNumConnectableNetworksBucketArray(mTotalBssidsInScanHistogram); 225108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mWifiLogProto.availableOpenSsidsInScanHistogram = 225208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne makeNumConnectableNetworksBucketArray(mAvailableOpenSsidsInScanHistogram); 225308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mWifiLogProto.availableOpenBssidsInScanHistogram = 225408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne makeNumConnectableNetworksBucketArray(mAvailableOpenBssidsInScanHistogram); 225508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mWifiLogProto.availableSavedSsidsInScanHistogram = 225608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne makeNumConnectableNetworksBucketArray(mAvailableSavedSsidsInScanHistogram); 225708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mWifiLogProto.availableSavedBssidsInScanHistogram = 225808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne makeNumConnectableNetworksBucketArray(mAvailableSavedBssidsInScanHistogram); 225908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mWifiLogProto.availableOpenOrSavedSsidsInScanHistogram = 226008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne makeNumConnectableNetworksBucketArray( 226108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mAvailableOpenOrSavedSsidsInScanHistogram); 226208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mWifiLogProto.availableOpenOrSavedBssidsInScanHistogram = 226308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne makeNumConnectableNetworksBucketArray( 226408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mAvailableOpenOrSavedBssidsInScanHistogram); 226508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mWifiLogProto.availableSavedPasspointProviderProfilesInScanHistogram = 226608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne makeNumConnectableNetworksBucketArray( 226708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mAvailableSavedPasspointProviderProfilesInScanHistogram); 226808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mWifiLogProto.availableSavedPasspointProviderBssidsInScanHistogram = 226908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne makeNumConnectableNetworksBucketArray( 227008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mAvailableSavedPasspointProviderBssidsInScanHistogram); 2271910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen mWifiLogProto.wifiAwareLog = mWifiAwareMetrics.consolidateProto(); 227202e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen mWifiLogProto.wifiRttLog = mRttMetrics.consolidateProto(); 2273a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh 2274a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh mWifiLogProto.pnoScanMetrics = mPnoScanMetrics; 2275a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen 2276a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen /** 2277a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen * Convert the SparseIntArray of "Connect to Network" notification types and counts to 2278a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen * proto's repeated IntKeyVal array. 2279a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen */ 2280a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen ConnectToNetworkNotificationAndActionCount[] notificationCountArray = 2281a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen new ConnectToNetworkNotificationAndActionCount[ 2282a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen mConnectToNetworkNotificationCount.size()]; 2283a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen for (int i = 0; i < mConnectToNetworkNotificationCount.size(); i++) { 2284a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen ConnectToNetworkNotificationAndActionCount keyVal = 2285a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen new ConnectToNetworkNotificationAndActionCount(); 2286a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen keyVal.notification = mConnectToNetworkNotificationCount.keyAt(i); 2287a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen keyVal.recommender = 2288a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen ConnectToNetworkNotificationAndActionCount.RECOMMENDER_OPEN; 2289a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen keyVal.count = mConnectToNetworkNotificationCount.valueAt(i); 2290a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen notificationCountArray[i] = keyVal; 2291a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen } 2292a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen mWifiLogProto.connectToNetworkNotificationCount = notificationCountArray; 2293a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen 2294a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen /** 2295a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen * Convert the SparseIntArray of "Connect to Network" notification types and counts to 2296a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen * proto's repeated IntKeyVal array. 2297a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen */ 2298a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen ConnectToNetworkNotificationAndActionCount[] notificationActionCountArray = 2299a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen new ConnectToNetworkNotificationAndActionCount[ 2300a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen mConnectToNetworkNotificationActionCount.size()]; 2301a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen for (int i = 0; i < mConnectToNetworkNotificationActionCount.size(); i++) { 2302a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen ConnectToNetworkNotificationAndActionCount keyVal = 2303a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen new ConnectToNetworkNotificationAndActionCount(); 2304a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen int key = mConnectToNetworkNotificationActionCount.keyAt(i); 2305a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen keyVal.notification = key / CONNECT_TO_NETWORK_NOTIFICATION_ACTION_KEY_MULTIPLIER; 2306a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen keyVal.action = key % CONNECT_TO_NETWORK_NOTIFICATION_ACTION_KEY_MULTIPLIER; 2307a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen keyVal.recommender = 2308a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen ConnectToNetworkNotificationAndActionCount.RECOMMENDER_OPEN; 2309a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen keyVal.count = mConnectToNetworkNotificationActionCount.valueAt(i); 2310a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen notificationActionCountArray[i] = keyVal; 2311a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen } 2312a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen mWifiLogProto.connectToNetworkNotificationActionCount = notificationActionCountArray; 2313a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen 2314a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen mWifiLogProto.openNetworkRecommenderBlacklistSize = 2315a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen mOpenNetworkRecommenderBlacklistSize; 2316a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen mWifiLogProto.isWifiNetworksAvailableNotificationOn = 2317a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen mIsWifiNetworksAvailableNotificationOn; 2318a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen mWifiLogProto.numOpenNetworkRecommendationUpdates = 2319a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen mNumOpenNetworkRecommendationUpdates; 2320a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen mWifiLogProto.numOpenNetworkConnectMessageFailedToSend = 2321a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen mNumOpenNetworkConnectMessageFailedToSend; 23229831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen 23239831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen mWifiLogProto.observedHotspotR1ApsInScanHistogram = 23249831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen makeNumConnectableNetworksBucketArray(mObservedHotspotR1ApInScanHistogram); 23259831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen mWifiLogProto.observedHotspotR2ApsInScanHistogram = 23269831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen makeNumConnectableNetworksBucketArray(mObservedHotspotR2ApInScanHistogram); 23279831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen mWifiLogProto.observedHotspotR1EssInScanHistogram = 23289831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen makeNumConnectableNetworksBucketArray(mObservedHotspotR1EssInScanHistogram); 23299831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen mWifiLogProto.observedHotspotR2EssInScanHistogram = 23309831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen makeNumConnectableNetworksBucketArray(mObservedHotspotR2EssInScanHistogram); 23319831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen mWifiLogProto.observedHotspotR1ApsPerEssInScanHistogram = 23329831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen makeNumConnectableNetworksBucketArray( 23339831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen mObservedHotspotR1ApsPerEssInScanHistogram); 23349831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen mWifiLogProto.observedHotspotR2ApsPerEssInScanHistogram = 23359831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen makeNumConnectableNetworksBucketArray( 23369831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen mObservedHotspotR2ApsPerEssInScanHistogram); 233705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh 2338973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen mWifiLogProto.observed80211McSupportingApsInScanHistogram = 2339973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen makeNumConnectableNetworksBucketArray(mObserved80211mcApInScanHistogram); 2340973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen 234105ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh if (mSoftApEventListTethered.size() > 0) { 234205ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh mWifiLogProto.softApConnectedClientsEventsTethered = 234305ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh mSoftApEventListTethered.toArray( 234405ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh mWifiLogProto.softApConnectedClientsEventsTethered); 234505ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh } 234605ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh if (mSoftApEventListLocalOnly.size() > 0) { 234705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh mWifiLogProto.softApConnectedClientsEventsLocalOnly = 234805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh mSoftApEventListLocalOnly.toArray( 234905ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh mWifiLogProto.softApConnectedClientsEventsLocalOnly); 235005ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh } 235162344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim 235262344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim mWifiLogProto.wpsMetrics = mWpsMetrics; 2353fb165562c8c77a9e5e2452f33aedb8e4369e7a9bSiddharth Ray mWifiLogProto.wifiPowerStats = mWifiPowerMetrics.buildProto(); 235412d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach mWifiLogProto.wifiWakeStats = mWifiWakeMetrics.buildProto(); 235528a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim mWifiLogProto.isMacRandomizationOn = mIsMacRandomizationOn; 2356ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } 23571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 23582532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne 235908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private WifiMetricsProto.NumConnectableNetworksBucket[] makeNumConnectableNetworksBucketArray( 236008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne SparseIntArray sia) { 236108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne WifiMetricsProto.NumConnectableNetworksBucket[] array = 236208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne new WifiMetricsProto.NumConnectableNetworksBucket[sia.size()]; 236308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne for (int i = 0; i < sia.size(); i++) { 236408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne WifiMetricsProto.NumConnectableNetworksBucket keyVal = 236508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne new WifiMetricsProto.NumConnectableNetworksBucket(); 236608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne keyVal.numConnectableNetworks = sia.keyAt(i); 236708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne keyVal.count = sia.valueAt(i); 236808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne array[i] = keyVal; 236908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 237008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne return array; 237108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 237208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne 23732532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne /** 2374a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen * Clear all WifiMetrics, except for currentConnectionEvent and Open Network Notification 2375a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen * feature enabled state, blacklist size. 23762532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne */ 23772532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne private void clear() { 23782532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne synchronized (mLock) { 23792532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mConnectionEventList.clear(); 23802532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne if (mCurrentConnectionEvent != null) { 23812532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mConnectionEventList.add(mCurrentConnectionEvent); 23822532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 23832532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mScanReturnEntries.clear(); 23842532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mWifiSystemStateEntries.clear(); 2385107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne mRecordStartTimeSec = mClock.getElapsedSinceBootMillis() / 1000; 23867a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne mRssiPollCounts.clear(); 23875cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mRssiDeltaCounts.clear(); 2388f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal mWifiAlertReasonCounts.clear(); 23894569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao mWifiScoreCounts.clear(); 23902532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mWifiLogProto.clear(); 23915cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mScanResultRssiTimestampMillis = -1; 239244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mSoftApManagerReturnCodeCounts.clear(); 239346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mStaEventList.clear(); 2394910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen mWifiAwareMetrics.clear(); 239502e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen mRttMetrics.clear(); 239608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mTotalSsidsInScanHistogram.clear(); 239708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mTotalBssidsInScanHistogram.clear(); 239808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mAvailableOpenSsidsInScanHistogram.clear(); 239908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mAvailableOpenBssidsInScanHistogram.clear(); 240008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mAvailableSavedSsidsInScanHistogram.clear(); 240108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mAvailableSavedBssidsInScanHistogram.clear(); 240208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mAvailableOpenOrSavedSsidsInScanHistogram.clear(); 240308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mAvailableOpenOrSavedBssidsInScanHistogram.clear(); 240408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mAvailableSavedPasspointProviderProfilesInScanHistogram.clear(); 240508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mAvailableSavedPasspointProviderBssidsInScanHistogram.clear(); 2406a2dae3436431f3fe2ac79ad087fe62f6fcda8ad7Mehdi Alizadeh mPnoScanMetrics.clear(); 2407a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen mConnectToNetworkNotificationCount.clear(); 2408a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen mConnectToNetworkNotificationActionCount.clear(); 2409a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen mNumOpenNetworkRecommendationUpdates = 0; 2410a88242633e76bf3a070cfcc0a018ff7f9806f1f4Stephen Chen mNumOpenNetworkConnectMessageFailedToSend = 0; 24119831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen mObservedHotspotR1ApInScanHistogram.clear(); 24129831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen mObservedHotspotR2ApInScanHistogram.clear(); 24139831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen mObservedHotspotR1EssInScanHistogram.clear(); 24149831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen mObservedHotspotR2EssInScanHistogram.clear(); 24159831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen mObservedHotspotR1ApsPerEssInScanHistogram.clear(); 24169831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen mObservedHotspotR2ApsPerEssInScanHistogram.clear(); 241705ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh mSoftApEventListTethered.clear(); 241805ded0fe9fa0a94a16b55b1d6f4d45851988b928Mehdi Alizadeh mSoftApEventListLocalOnly.clear(); 241962344ca195973550de0954badfd6c56fe3dd119bJong Wook Kim mWpsMetrics.clear(); 242012d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach mWifiWakeMetrics.clear(); 2421973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen mObserved80211mcApInScanHistogram.clear(); 24222532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 24232532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 2424ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne 2425ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne /** 2426ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne * Set screen state (On/Off) 2427ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne */ 2428ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne public void setScreenState(boolean screenOn) { 2429ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne synchronized (mLock) { 2430ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mScreenOn = screenOn; 2431ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne } 2432ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne } 2433ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne 2434ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne /** 2435ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne * Set wifi state (WIFI_UNKNOWN, WIFI_DISABLED, WIFI_DISCONNECTED, WIFI_ASSOCIATED) 2436ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne */ 2437ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne public void setWifiState(int wifiState) { 2438ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne synchronized (mLock) { 2439ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mWifiState = wifiState; 2440e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass mWifiWins = (wifiState == WifiMetricsProto.WifiLog.WIFI_ASSOCIATED); 2441ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne } 2442ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne } 244346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 244446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 244546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Message handler for interesting WifiMonitor messages. Generates StaEvents 244646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 244746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private void processMessage(Message msg) { 244846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne StaEvent event = new StaEvent(); 244946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne boolean logEvent = true; 245046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne switch (msg.what) { 245146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiMonitor.ASSOCIATION_REJECTION_EVENT: 245246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.type = StaEvent.TYPE_ASSOCIATION_REJECTION_EVENT; 245346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.associationTimedOut = msg.arg1 > 0 ? true : false; 245446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.status = msg.arg2; 245546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 245646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiMonitor.AUTHENTICATION_FAILURE_EVENT: 245746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.type = StaEvent.TYPE_AUTHENTICATION_FAILURE_EVENT; 2458b6a730ce63a9a864adaea6ba1bee827444be52a5Ahmed ElArabawy switch (msg.arg1) { 245946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiManager.ERROR_AUTH_FAILURE_NONE: 246046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.authFailureReason = StaEvent.AUTH_FAILURE_NONE; 246146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 246246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiManager.ERROR_AUTH_FAILURE_TIMEOUT: 246346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.authFailureReason = StaEvent.AUTH_FAILURE_TIMEOUT; 246446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 246546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiManager.ERROR_AUTH_FAILURE_WRONG_PSWD: 246646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.authFailureReason = StaEvent.AUTH_FAILURE_WRONG_PSWD; 246746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 246846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiManager.ERROR_AUTH_FAILURE_EAP_FAILURE: 246946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.authFailureReason = StaEvent.AUTH_FAILURE_EAP_FAILURE; 247046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 247146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne default: 247246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 247346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 247446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 247546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiMonitor.NETWORK_CONNECTION_EVENT: 247646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.type = StaEvent.TYPE_NETWORK_CONNECTION_EVENT; 247746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 247846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiMonitor.NETWORK_DISCONNECTION_EVENT: 247946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.type = StaEvent.TYPE_NETWORK_DISCONNECTION_EVENT; 248046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.reason = msg.arg2; 248146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.localGen = msg.arg1 == 0 ? false : true; 248246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 248346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT: 248446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne logEvent = false; 248546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne StateChangeResult stateChangeResult = (StateChangeResult) msg.obj; 248646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mSupplicantStateChangeBitmask |= supplicantStateToBit(stateChangeResult.state); 248746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 248846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiStateMachine.CMD_ASSOCIATED_BSSID: 248946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.type = StaEvent.TYPE_CMD_ASSOCIATED_BSSID; 249046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 249146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiStateMachine.CMD_TARGET_BSSID: 249246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.type = StaEvent.TYPE_CMD_TARGET_BSSID; 249346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 249446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne default: 249546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return; 249646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 249746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (logEvent) { 249846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne addStaEvent(event); 249946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 250046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 250146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 250246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Log a StaEvent from WifiStateMachine. The StaEvent must not be one of the supplicant 250346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * generated event types, which are logged through 'sendMessage' 250446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * @param type StaEvent.EventType describing the event 250546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 250646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public void logStaEvent(int type) { 250746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne logStaEvent(type, StaEvent.DISCONNECT_UNKNOWN, null); 250846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 250946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 251046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Log a StaEvent from WifiStateMachine. The StaEvent must not be one of the supplicant 251146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * generated event types, which are logged through 'sendMessage' 251246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * @param type StaEvent.EventType describing the event 251346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * @param config WifiConfiguration for a framework initiated connection attempt 251446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 251546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public void logStaEvent(int type, WifiConfiguration config) { 251646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne logStaEvent(type, StaEvent.DISCONNECT_UNKNOWN, config); 251746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 251846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 251946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Log a StaEvent from WifiStateMachine. The StaEvent must not be one of the supplicant 252046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * generated event types, which are logged through 'sendMessage' 252146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * @param type StaEvent.EventType describing the event 252246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * @param frameworkDisconnectReason StaEvent.FrameworkDisconnectReason explaining why framework 252346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * initiated a FRAMEWORK_DISCONNECT 252446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 252546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public void logStaEvent(int type, int frameworkDisconnectReason) { 252646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne logStaEvent(type, frameworkDisconnectReason, null); 252746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 252846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 252946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Log a StaEvent from WifiStateMachine. The StaEvent must not be one of the supplicant 253046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * generated event types, which are logged through 'sendMessage' 253146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * @param type StaEvent.EventType describing the event 253246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * @param frameworkDisconnectReason StaEvent.FrameworkDisconnectReason explaining why framework 253346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * initiated a FRAMEWORK_DISCONNECT 253446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * @param config WifiConfiguration for a framework initiated connection attempt 253546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 253646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public void logStaEvent(int type, int frameworkDisconnectReason, WifiConfiguration config) { 253746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne switch (type) { 253846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_IP_CONFIGURATION_SUCCESSFUL: 253946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_IP_CONFIGURATION_LOST: 254046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_IP_REACHABILITY_LOST: 254146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_START_CONNECT: 254246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_START_ROAM: 254346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CONNECT_NETWORK: 254446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_NETWORK_AGENT_VALID_NETWORK: 254546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_FRAMEWORK_DISCONNECT: 2546e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass case StaEvent.TYPE_SCORE_BREACH: 254728a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim case StaEvent.TYPE_MAC_CHANGE: 254846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 254946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne default: 255046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne Log.e(TAG, "Unknown StaEvent:" + type); 255146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return; 255246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 255346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne StaEvent event = new StaEvent(); 255446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.type = type; 255546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (frameworkDisconnectReason != StaEvent.DISCONNECT_UNKNOWN) { 255646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.frameworkDisconnectReason = frameworkDisconnectReason; 255746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 255846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.configInfo = createConfigInfo(config); 255946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne addStaEvent(event); 256046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 256146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 256246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private void addStaEvent(StaEvent staEvent) { 256346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne staEvent.startTimeMillis = mClock.getElapsedSinceBootMillis(); 256446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne staEvent.lastRssi = mLastPollRssi; 256546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne staEvent.lastFreq = mLastPollFreq; 256646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne staEvent.lastLinkSpeed = mLastPollLinkSpeed; 256746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne staEvent.supplicantStateChangesBitmask = mSupplicantStateChangeBitmask; 2568e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass staEvent.lastScore = mLastScore; 256946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mSupplicantStateChangeBitmask = 0; 257046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mLastPollRssi = -127; 257146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mLastPollFreq = -1; 257246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mLastPollLinkSpeed = -1; 2573e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass mLastScore = -1; 2574d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne mStaEventList.add(new StaEventWithTime(staEvent, mClock.getWallClockMillis())); 257546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne // Prune StaEventList if it gets too long 257646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (mStaEventList.size() > MAX_STA_EVENTS) mStaEventList.remove(); 257746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 257846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 257946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private ConfigInfo createConfigInfo(WifiConfiguration config) { 258046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (config == null) return null; 258146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne ConfigInfo info = new ConfigInfo(); 258246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.allowedKeyManagement = bitSetToInt(config.allowedKeyManagement); 258346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.allowedProtocols = bitSetToInt(config.allowedProtocols); 258446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.allowedAuthAlgorithms = bitSetToInt(config.allowedAuthAlgorithms); 258546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.allowedPairwiseCiphers = bitSetToInt(config.allowedPairwiseCiphers); 258646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.allowedGroupCiphers = bitSetToInt(config.allowedGroupCiphers); 258746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.hiddenSsid = config.hiddenSSID; 258846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.isPasspoint = config.isPasspoint(); 258946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.isEphemeral = config.isEphemeral(); 259046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.hasEverConnected = config.getNetworkSelectionStatus().getHasEverConnected(); 259146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne ScanResult candidate = config.getNetworkSelectionStatus().getCandidate(); 259246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (candidate != null) { 259346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.scanRssi = candidate.level; 259446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.scanFreq = candidate.frequency; 259546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 259646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return info; 259746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 259846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 259946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public Handler getHandler() { 260046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return mHandler; 260146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 260246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 2603910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen public WifiAwareMetrics getWifiAwareMetrics() { 2604910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen return mWifiAwareMetrics; 2605910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen } 2606910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen 260712d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach public WifiWakeMetrics getWakeupMetrics() { 260812d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach return mWifiWakeMetrics; 260912d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach } 261012d31e7fea8e5c17dddc0ab433c26c31a3bf2550Eric Schwarzenbach 261102e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen public RttMetrics getRttMetrics() { 261202e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen return mRttMetrics; 261302e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen } 261402e1422fc015b3dc38f8afdfb8e1aec95881fefcEtan Cohen 261546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne // Rather than generate a StaEvent for each SUPPLICANT_STATE_CHANGE, cache these in a bitmask 261646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne // and attach it to the next event which is generated. 261746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private int mSupplicantStateChangeBitmask = 0; 261846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 261946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 262046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Converts a SupplicantState value to a single bit, with position defined by 262146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * {@code StaEvent.SupplicantState} 262246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 262346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public static int supplicantStateToBit(SupplicantState state) { 262446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne switch(state) { 262546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case DISCONNECTED: 262646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_DISCONNECTED; 262746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case INTERFACE_DISABLED: 262846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_INTERFACE_DISABLED; 262946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case INACTIVE: 263046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_INACTIVE; 263146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case SCANNING: 263246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_SCANNING; 263346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case AUTHENTICATING: 263446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_AUTHENTICATING; 263546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case ASSOCIATING: 263646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_ASSOCIATING; 263746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case ASSOCIATED: 263846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_ASSOCIATED; 263946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case FOUR_WAY_HANDSHAKE: 264046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_FOUR_WAY_HANDSHAKE; 264146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case GROUP_HANDSHAKE: 264246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_GROUP_HANDSHAKE; 264346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case COMPLETED: 264446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_COMPLETED; 264546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case DORMANT: 264646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_DORMANT; 264746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case UNINITIALIZED: 264846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_UNINITIALIZED; 264946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case INVALID: 265046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_INVALID; 265146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne default: 265246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne Log.wtf(TAG, "Got unknown supplicant state: " + state.ordinal()); 265346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 0; 265446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 265546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 265646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 265746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static String supplicantStateChangesBitmaskToString(int mask) { 265846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne StringBuilder sb = new StringBuilder(); 2659d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append("supplicantStateChangeEvents: {"); 266046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_DISCONNECTED)) > 0) sb.append(" DISCONNECTED"); 266146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_INTERFACE_DISABLED)) > 0) sb.append(" INTERFACE_DISABLED"); 266246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_INACTIVE)) > 0) sb.append(" INACTIVE"); 266346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_SCANNING)) > 0) sb.append(" SCANNING"); 266446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_AUTHENTICATING)) > 0) sb.append(" AUTHENTICATING"); 266546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_ASSOCIATING)) > 0) sb.append(" ASSOCIATING"); 266646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_ASSOCIATED)) > 0) sb.append(" ASSOCIATED"); 266746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_FOUR_WAY_HANDSHAKE)) > 0) sb.append(" FOUR_WAY_HANDSHAKE"); 266846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_GROUP_HANDSHAKE)) > 0) sb.append(" GROUP_HANDSHAKE"); 266946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_COMPLETED)) > 0) sb.append(" COMPLETED"); 267046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_DORMANT)) > 0) sb.append(" DORMANT"); 267146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_UNINITIALIZED)) > 0) sb.append(" UNINITIALIZED"); 267246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_INVALID)) > 0) sb.append(" INVALID"); 267346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne sb.append("}"); 267446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return sb.toString(); 267546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 267646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 267746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 267846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Returns a human readable string from a Sta Event. Only adds information relevant to the event 267946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * type. 268046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 268146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public static String staEventToString(StaEvent event) { 268246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (event == null) return "<NULL>"; 268346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne StringBuilder sb = new StringBuilder(); 268446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne switch (event.type) { 268546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_ASSOCIATION_REJECTION_EVENT: 2686d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append("ASSOCIATION_REJECTION_EVENT") 268746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" timedOut=").append(event.associationTimedOut) 268846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" status=").append(event.status).append(":") 268946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(ISupplicantStaIfaceCallback.StatusCode.toString(event.status)); 269046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 269146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_AUTHENTICATION_FAILURE_EVENT: 2692d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append("AUTHENTICATION_FAILURE_EVENT reason=").append(event.authFailureReason) 269346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(":").append(authFailureReasonToString(event.authFailureReason)); 269446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 269546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_NETWORK_CONNECTION_EVENT: 2696d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append("NETWORK_CONNECTION_EVENT"); 269746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 269846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_NETWORK_DISCONNECTION_EVENT: 2699d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append("NETWORK_DISCONNECTION_EVENT") 270046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" local_gen=").append(event.localGen) 270146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" reason=").append(event.reason).append(":") 270246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(ISupplicantStaIfaceCallback.ReasonCode.toString( 270346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne (event.reason >= 0 ? event.reason : -1 * event.reason))); 270446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 270546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_ASSOCIATED_BSSID: 2706d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append("CMD_ASSOCIATED_BSSID"); 270746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 270846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_IP_CONFIGURATION_SUCCESSFUL: 2709d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append("CMD_IP_CONFIGURATION_SUCCESSFUL"); 271046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 271146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_IP_CONFIGURATION_LOST: 2712d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append("CMD_IP_CONFIGURATION_LOST"); 271346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 271446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_IP_REACHABILITY_LOST: 2715d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append("CMD_IP_REACHABILITY_LOST"); 271646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 271746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_TARGET_BSSID: 2718d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append("CMD_TARGET_BSSID"); 271946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 272046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_START_CONNECT: 2721d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append("CMD_START_CONNECT"); 272246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 272346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_START_ROAM: 2724d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append("CMD_START_ROAM"); 272546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 272646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CONNECT_NETWORK: 2727d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append("CONNECT_NETWORK"); 272846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 272946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_NETWORK_AGENT_VALID_NETWORK: 2730d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append("NETWORK_AGENT_VALID_NETWORK"); 273146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 273246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_FRAMEWORK_DISCONNECT: 2733d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append("FRAMEWORK_DISCONNECT") 273446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" reason=") 273546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(frameworkDisconnectReasonToString(event.frameworkDisconnectReason)); 273646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 2737e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass case StaEvent.TYPE_SCORE_BREACH: 2738e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass sb.append("SCORE_BREACH"); 2739e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass break; 274028a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim case StaEvent.TYPE_MAC_CHANGE: 274128a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim sb.append("MAC_CHANGE"); 274228a6c752451084392a71b3c70d984ef9e066d4e2Jong Wook Kim break; 274346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne default: 274446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne sb.append("UNKNOWN " + event.type + ":"); 274546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 274646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 274746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (event.lastRssi != -127) sb.append(" lastRssi=").append(event.lastRssi); 274846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (event.lastFreq != -1) sb.append(" lastFreq=").append(event.lastFreq); 274946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (event.lastLinkSpeed != -1) sb.append(" lastLinkSpeed=").append(event.lastLinkSpeed); 2750e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass if (event.lastScore != -1) sb.append(" lastScore=").append(event.lastScore); 275146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (event.supplicantStateChangesBitmask != 0) { 2752d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append(", ").append(supplicantStateChangesBitmaskToString( 275346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.supplicantStateChangesBitmask)); 275446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 275546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (event.configInfo != null) { 2756d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append(", ").append(configInfoToString(event.configInfo)); 275746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 275846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 275946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return sb.toString(); 276046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 276146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 276246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static String authFailureReasonToString(int authFailureReason) { 276346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne switch (authFailureReason) { 276446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.AUTH_FAILURE_NONE: 276546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "ERROR_AUTH_FAILURE_NONE"; 276646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.AUTH_FAILURE_TIMEOUT: 276746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "ERROR_AUTH_FAILURE_TIMEOUT"; 276846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.AUTH_FAILURE_WRONG_PSWD: 276946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "ERROR_AUTH_FAILURE_WRONG_PSWD"; 277046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.AUTH_FAILURE_EAP_FAILURE: 277146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "ERROR_AUTH_FAILURE_EAP_FAILURE"; 277246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne default: 277346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return ""; 277446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 277546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 277646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 277746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static String frameworkDisconnectReasonToString(int frameworkDisconnectReason) { 277846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne switch (frameworkDisconnectReason) { 277946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.DISCONNECT_API: 278046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "DISCONNECT_API"; 278146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.DISCONNECT_GENERIC: 278246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "DISCONNECT_GENERIC"; 278346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.DISCONNECT_UNWANTED: 278446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "DISCONNECT_UNWANTED"; 278546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.DISCONNECT_ROAM_WATCHDOG_TIMER: 278646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "DISCONNECT_ROAM_WATCHDOG_TIMER"; 278746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.DISCONNECT_P2P_DISCONNECT_WIFI_REQUEST: 278846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "DISCONNECT_P2P_DISCONNECT_WIFI_REQUEST"; 278946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.DISCONNECT_RESET_SIM_NETWORKS: 279046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "DISCONNECT_RESET_SIM_NETWORKS"; 279146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne default: 279246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "DISCONNECT_UNKNOWN=" + frameworkDisconnectReason; 279346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 279446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 279546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 279646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static String configInfoToString(ConfigInfo info) { 279746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne StringBuilder sb = new StringBuilder(); 279846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne sb.append("ConfigInfo:") 279946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" allowed_key_management=").append(info.allowedKeyManagement) 280046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" allowed_protocols=").append(info.allowedProtocols) 280146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" allowed_auth_algorithms=").append(info.allowedAuthAlgorithms) 280246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" allowed_pairwise_ciphers=").append(info.allowedPairwiseCiphers) 280346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" allowed_group_ciphers=").append(info.allowedGroupCiphers) 280446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" hidden_ssid=").append(info.hiddenSsid) 280546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" is_passpoint=").append(info.isPasspoint) 280646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" is_ephemeral=").append(info.isEphemeral) 280746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" has_ever_connected=").append(info.hasEverConnected) 280846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" scan_rssi=").append(info.scanRssi) 280946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" scan_freq=").append(info.scanFreq); 281046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return sb.toString(); 281146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 281246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 2813e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass public static final int MAX_STA_EVENTS = 768; 2814d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne private LinkedList<StaEventWithTime> mStaEventList = new LinkedList<StaEventWithTime>(); 281546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private int mLastPollRssi = -127; 281646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private int mLastPollLinkSpeed = -1; 281746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private int mLastPollFreq = -1; 2818e6fb5b05c294b853f768caa93de509b4afa8adefMichael Plass private int mLastScore = -1; 281946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 282046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 282146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Converts the first 31 bits of a BitSet to a little endian int 282246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 282346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static int bitSetToInt(BitSet bits) { 282446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne int value = 0; 282546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne int nBits = bits.length() < 31 ? bits.length() : 31; 282646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne for (int i = 0; i < nBits; i++) { 282746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne value += bits.get(i) ? (1 << i) : 0; 282846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 282946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return value; 283046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 283108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private void incrementSsid(SparseIntArray sia, int element) { 283208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne increment(sia, Math.min(element, MAX_CONNECTABLE_SSID_NETWORK_BUCKET)); 283308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 283408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private void incrementBssid(SparseIntArray sia, int element) { 283508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne increment(sia, Math.min(element, MAX_CONNECTABLE_BSSID_NETWORK_BUCKET)); 283608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 283708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private void incrementTotalScanResults(SparseIntArray sia, int element) { 283808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne increment(sia, Math.min(element, MAX_TOTAL_SCAN_RESULTS_BUCKET)); 283908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 284008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private void incrementTotalScanSsids(SparseIntArray sia, int element) { 284108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne increment(sia, Math.min(element, MAX_TOTAL_SCAN_RESULT_SSIDS_BUCKET)); 284208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 28439831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen private void incrementTotalPasspointAps(SparseIntArray sia, int element) { 28449831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen increment(sia, Math.min(element, MAX_TOTAL_PASSPOINT_APS_BUCKET)); 28459831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen } 28469831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen private void incrementTotalUniquePasspointEss(SparseIntArray sia, int element) { 28479831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen increment(sia, Math.min(element, MAX_TOTAL_PASSPOINT_UNIQUE_ESS_BUCKET)); 28489831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen } 28499831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen private void incrementPasspointPerUniqueEss(SparseIntArray sia, int element) { 28509831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen increment(sia, Math.min(element, MAX_PASSPOINT_APS_PER_UNIQUE_ESS_BUCKET)); 28519831c1a04929d8d2cadbebbc1e6843895653bd4cEtan Cohen } 2852973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen private void increment80211mcAps(SparseIntArray sia, int element) { 2853973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen increment(sia, Math.min(element, MAX_TOTAL_80211MC_APS_BUCKET)); 2854973e49552e5536a5accc391f7760aaafa694df6fEtan Cohen } 285508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private void increment(SparseIntArray sia, int element) { 285608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne int count = sia.get(element); 285708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne sia.put(element, count + 1); 285808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 2859d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne 2860d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne private static class StaEventWithTime { 2861d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne public StaEvent staEvent; 2862d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne public long wallClockMillis; 2863d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne 2864d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne StaEventWithTime(StaEvent event, long wallClockMillis) { 2865d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne staEvent = event; 2866d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne this.wallClockMillis = wallClockMillis; 2867d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne } 2868d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne 2869d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne public String toString() { 2870d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne StringBuilder sb = new StringBuilder(); 2871d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne Calendar c = Calendar.getInstance(); 2872d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne c.setTimeInMillis(wallClockMillis); 2873d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne if (wallClockMillis != 0) { 2874d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append(String.format("%tm-%td %tH:%tM:%tS.%tL", c, c, c, c, c, c)); 2875d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne } else { 2876d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append(" "); 2877d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne } 2878d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append(" ").append(staEventToString(staEvent)); 2879d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne return sb.toString(); 2880d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne } 2881d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne } 28821b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne} 2883