WifiMetrics.java revision d582c6dfdbb3989b8b761a6cba608a0a3ce35df2
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 34910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohenimport com.android.server.wifi.aware.WifiAwareMetrics; 35f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhneimport com.android.server.wifi.hotspot2.NetworkDetail; 3608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhneimport com.android.server.wifi.hotspot2.PasspointManager; 3708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhneimport com.android.server.wifi.hotspot2.PasspointMatch; 3808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhneimport com.android.server.wifi.hotspot2.PasspointProvider; 39da94688198c864bb29be2e9603ebbe9ae6492a87Tamas Berghammerimport com.android.server.wifi.nano.WifiMetricsProto; 4046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport com.android.server.wifi.nano.WifiMetricsProto.StaEvent; 4146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport com.android.server.wifi.nano.WifiMetricsProto.StaEvent.ConfigInfo; 42f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhneimport com.android.server.wifi.util.InformationElementUtil; 4359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhneimport com.android.server.wifi.util.ScanResultUtil; 44f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne 451b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.io.FileDescriptor; 461b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.io.PrintWriter; 471b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.ArrayList; 4846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport java.util.BitSet; 491b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.Calendar; 5008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhneimport java.util.HashSet; 5146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport java.util.LinkedList; 521b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.List; 5308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhneimport java.util.Set; 541b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 551b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne/** 561b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Provides storage for wireless connectivity metrics, as they are generated. 571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Metrics logged by this class include: 581b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Aggregated connection stats (num of connections, num of failures, ...) 591b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Discrete connection event stats (time, duration, failure codes, ...) 601b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Router details (technology type, authentication type, ...) 611b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Scan stats 621b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 631b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhnepublic class WifiMetrics { 641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private static final String TAG = "WifiMetrics"; 65c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private static final boolean DBG = false; 667a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne /** 677a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne * Clamp the RSSI poll counts to values between [MIN,MAX]_RSSI_POLL 687a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne */ 697a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne private static final int MAX_RSSI_POLL = 0; 707a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne private static final int MIN_RSSI_POLL = -127; 715cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne public static final int MAX_RSSI_DELTA = 127; 725cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne public static final int MIN_RSSI_DELTA = -127; 735cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne /** Maximum time period between ScanResult and RSSI poll to generate rssi delta datapoint */ 745cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne public static final long TIMEOUT_RSSI_DELTA_MILLIS = 3000; 754569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao private static final int MIN_WIFI_SCORE = 0; 764569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao private static final int MAX_WIFI_SCORE = NetworkAgent.WIFI_BASE_SCORE; 771b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private final Object mLock = new Object(); 782532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne private static final int MAX_CONNECTION_EVENTS = 256; 7908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne // Largest bucket in the NumConnectableNetworkCount histogram, 8008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne // anything large will be stored in this bucket 8108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne public static final int MAX_CONNECTABLE_SSID_NETWORK_BUCKET = 20; 8208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne public static final int MAX_CONNECTABLE_BSSID_NETWORK_BUCKET = 50; 8308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne public static final int MAX_TOTAL_SCAN_RESULT_SSIDS_BUCKET = 100; 8408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne public static final int MAX_TOTAL_SCAN_RESULTS_BUCKET = 250; 85107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne private Clock mClock; 86ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne private boolean mScreenOn; 87ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne private int mWifiState; 88910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen private WifiAwareMetrics mWifiAwareMetrics; 8946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private Handler mHandler; 9008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private WifiConfigManager mWifiConfigManager; 9108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private WifiNetworkSelector mWifiNetworkSelector; 9208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private PasspointManager mPasspointManager; 931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 941b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Metrics are stored within an instance of the WifiLog proto during runtime, 951b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * The ConnectionEvent, SystemStateEntries & ScanReturnEntries metrics are stored during 961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * runtime in member lists of this WifiMetrics class, with the final WifiLog proto being pieced 971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * together at dump-time 981b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 997a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne private final WifiMetricsProto.WifiLog mWifiLogProto = new WifiMetricsProto.WifiLog(); 1001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 1011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Session information that gets logged for every Wifi connection attempt. 1021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 1037a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne private final List<ConnectionEvent> mConnectionEventList = new ArrayList<>(); 1041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 1051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * The latest started (but un-ended) connection attempt 1061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 1071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private ConnectionEvent mCurrentConnectionEvent; 1081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 1091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Count of number of times each scan return code, indexed by WifiLog.ScanReturnCode 1101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 1117a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne private final SparseIntArray mScanReturnEntries = new SparseIntArray(); 1121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 1131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Mapping of system state to the counts of scans requested in that wifi state * screenOn 1141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * combination. Indexed by WifiLog.WifiState * (1 + screenOn) 1151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 1167a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne private final SparseIntArray mWifiSystemStateEntries = new SparseIntArray(); 117f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal /** Mapping of RSSI values to counts. */ 118f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal private final SparseIntArray mRssiPollCounts = new SparseIntArray(); 1195cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne /** Mapping of RSSI scan-poll delta values to counts. */ 1205cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne private final SparseIntArray mRssiDeltaCounts = new SparseIntArray(); 1215cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne /** RSSI of the scan result for the last connection event*/ 1225cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne private int mScanResultRssi = 0; 1235cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne /** Boot-relative timestamp when the last candidate scanresult was received, used to calculate 1245cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne RSSI deltas. -1 designates no candidate scanResult being tracked */ 1255cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne private long mScanResultRssiTimestampMillis = -1; 126f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal /** Mapping of alert reason to the respective alert count. */ 127f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal private final SparseIntArray mWifiAlertReasonCounts = new SparseIntArray(); 128107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne /** 129107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne * Records the getElapsedSinceBootMillis (in seconds) that represents the beginning of data 130107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne * capture for for this WifiMetricsProto 131107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne */ 132107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne private long mRecordStartTimeSec; 1334569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao /** Mapping of Wifi Scores to counts */ 1344569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao private final SparseIntArray mWifiScoreCounts = new SparseIntArray(); 13544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein /** Mapping of SoftApManager start SoftAp return codes to counts */ 13644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein private final SparseIntArray mSoftApManagerReturnCodeCounts = new SparseIntArray(); 13708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne 13808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private final SparseIntArray mTotalSsidsInScanHistogram = new SparseIntArray(); 13908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private final SparseIntArray mTotalBssidsInScanHistogram = new SparseIntArray(); 14008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private final SparseIntArray mAvailableOpenSsidsInScanHistogram = new SparseIntArray(); 14108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private final SparseIntArray mAvailableOpenBssidsInScanHistogram = new SparseIntArray(); 14208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private final SparseIntArray mAvailableSavedSsidsInScanHistogram = new SparseIntArray(); 14308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private final SparseIntArray mAvailableSavedBssidsInScanHistogram = new SparseIntArray(); 14408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private final SparseIntArray mAvailableOpenOrSavedSsidsInScanHistogram = new SparseIntArray(); 14508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private final SparseIntArray mAvailableOpenOrSavedBssidsInScanHistogram = new SparseIntArray(); 14608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private final SparseIntArray mAvailableSavedPasspointProviderProfilesInScanHistogram = 14708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne new SparseIntArray(); 14808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private final SparseIntArray mAvailableSavedPasspointProviderBssidsInScanHistogram = 14908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne new SparseIntArray(); 15008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne 1511b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne class RouterFingerPrint { 1521b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private WifiMetricsProto.RouterFingerPrint mRouterFingerPrintProto; 1532532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne RouterFingerPrint() { 1541b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mRouterFingerPrintProto = new WifiMetricsProto.RouterFingerPrint(); 1551b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 1561b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 1571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public String toString() { 1581b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne StringBuilder sb = new StringBuilder(); 1591b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 1601b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append("mConnectionEvent.roamType=" + mRouterFingerPrintProto.roamType); 1611b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", mChannelInfo=" + mRouterFingerPrintProto.channelInfo); 1621b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", mDtim=" + mRouterFingerPrintProto.dtim); 1631b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", mAuthentication=" + mRouterFingerPrintProto.authentication); 1641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", mHidden=" + mRouterFingerPrintProto.hidden); 1651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", mRouterTechnology=" + mRouterFingerPrintProto.routerTechnology); 1661b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", mSupportsIpv6=" + mRouterFingerPrintProto.supportsIpv6); 1671b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 1681b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne return sb.toString(); 1691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 1702532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne public void updateFromWifiConfiguration(WifiConfiguration config) { 171ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne synchronized (mLock) { 172ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (config != null) { 173ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // Is this a hidden network 174ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mRouterFingerPrintProto.hidden = config.hiddenSSID; 175ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // Config may not have a valid dtimInterval set yet, in which case dtim will be zero 176ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // (These are only populated from beacon frame scan results, which are returned as 177ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // scan results from the chip far less frequently than Probe-responses) 178ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (config.dtimInterval > 0) { 179ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mRouterFingerPrintProto.dtim = config.dtimInterval; 180ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } 181ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mCurrentConnectionEvent.mConfigSsid = config.SSID; 182ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // Get AuthType information from config (We do this again from ScanResult after 183ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // associating with BSSID) 184ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (config.allowedKeyManagement != null 185ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne && config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.NONE)) { 186ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto 187ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_OPEN; 188ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } else if (config.isEnterprise()) { 189ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto 190ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_ENTERPRISE; 191ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } else { 192ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto 193ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL; 194ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } 19559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto 19659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne .passpoint = config.isPasspoint(); 197ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // If there's a ScanResult candidate associated with this config already, get it and 198ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // log (more accurate) metrics from it 199ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne ScanResult candidate = config.getNetworkSelectionStatus().getCandidate(); 200ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (candidate != null) { 201ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne updateMetricsFromScanResult(candidate); 202ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } 20396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne } 2042532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 2052532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 2061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 2071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 2081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 2091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Log event, tracking the start time, end time and result of a wireless connection attempt. 2101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 2111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne class ConnectionEvent { 2121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne WifiMetricsProto.ConnectionEvent mConnectionEvent; 21396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne //<TODO> Move these constants into a wifi.proto Enum, and create a new Failure Type field 21496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne //covering more than just l2 failures. see b/27652362 21596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne /** 21696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne * Failure codes, used for the 'level_2_failure_code' Connection event field (covers a lot 21796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne * more failures than just l2 though, since the proto does not have a place to log 21896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne * framework failures) 21996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne */ 2202532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne // Failure is unknown 22196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_UNKNOWN = 0; 2222532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne // NONE 22396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_NONE = 1; 2242532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne // ASSOCIATION_REJECTION_EVENT 22596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_ASSOCIATION_REJECTION = 2; 2262532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne // AUTHENTICATION_FAILURE_EVENT 22796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_AUTHENTICATION_FAILURE = 3; 2282532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne // SSID_TEMP_DISABLED (Also Auth failure) 22996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_SSID_TEMP_DISABLED = 4; 2304dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne // reconnect() or reassociate() call to WifiNative failed 23196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_CONNECT_NETWORK_FAILED = 5; 2322532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne // NETWORK_DISCONNECTION_EVENT 23396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_NETWORK_DISCONNECTION = 6; 2344dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne // NEW_CONNECTION_ATTEMPT before previous finished 23596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_NEW_CONNECTION_ATTEMPT = 7; 23696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne // New connection attempt to the same network & bssid 23796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_REDUNDANT_CONNECTION_ATTEMPT = 8; 23896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne // Roam Watchdog timer triggered (Roaming timed out) 23996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_ROAM_TIMEOUT = 9; 24096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne // DHCP failure 24196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_DHCP = 10; 24296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne 2434dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne RouterFingerPrint mRouterFingerPrint; 2444dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne private long mRealStartTime; 2454dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne private long mRealEndTime; 2464dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne private String mConfigSsid; 2474dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne private String mConfigBssid; 248ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne private int mWifiState; 249ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne private boolean mScreenOn; 2502532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne 2511b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private ConnectionEvent() { 2521b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mConnectionEvent = new WifiMetricsProto.ConnectionEvent(); 253947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne mRealEndTime = 0; 254947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne mRealStartTime = 0; 2552532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mRouterFingerPrint = new RouterFingerPrint(); 2562532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mConnectionEvent.routerFingerprint = mRouterFingerPrint.mRouterFingerPrintProto; 2574dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mConfigSsid = "<NULL>"; 2584dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mConfigBssid = "<NULL>"; 259ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mWifiState = WifiMetricsProto.WifiLog.WIFI_UNKNOWN; 260ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mScreenOn = false; 2611b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 2621b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 2631b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public String toString() { 2641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne StringBuilder sb = new StringBuilder(); 2651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append("startTime="); 2661b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne Calendar c = Calendar.getInstance(); 2671b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 2681b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne c.setTimeInMillis(mConnectionEvent.startTimeMillis); 2691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(mConnectionEvent.startTimeMillis == 0 ? " <null>" : 2701b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne String.format("%tm-%td %tH:%tM:%tS.%tL", c, c, c, c, c, c)); 2714dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(", SSID="); 2724dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(mConfigSsid); 2734dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(", BSSID="); 2744dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(mConfigBssid); 2754dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(", durationMillis="); 2761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(mConnectionEvent.durationTakenToConnectMillis); 2772532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append(", roamType="); 2784dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne switch(mConnectionEvent.roamType) { 2792532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne case 1: 2802532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append("ROAM_NONE"); 2812532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne break; 2822532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne case 2: 2832532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append("ROAM_DBDC"); 2842532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne break; 2852532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne case 3: 2862532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append("ROAM_ENTERPRISE"); 2872532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne break; 2882532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne case 4: 2892532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append("ROAM_USER_SELECTED"); 2902532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne break; 2912532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne case 5: 2922532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append("ROAM_UNRELATED"); 2932532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne break; 2942532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne default: 2952532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append("ROAM_UNKNOWN"); 2962532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 2974dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(", connectionResult="); 2984dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(mConnectionEvent.connectionResult); 2991b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", level2FailureCode="); 3004dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne switch(mConnectionEvent.level2FailureCode) { 30196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_NONE: 3024dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("NONE"); 3034dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 30496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_ASSOCIATION_REJECTION: 3054dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("ASSOCIATION_REJECTION"); 3064dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 30796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_AUTHENTICATION_FAILURE: 3084dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("AUTHENTICATION_FAILURE"); 3094dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 31096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_SSID_TEMP_DISABLED: 3114dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("SSID_TEMP_DISABLED"); 3124dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 31396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_CONNECT_NETWORK_FAILED: 3144dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("CONNECT_NETWORK_FAILED"); 3154dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 31696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_NETWORK_DISCONNECTION: 3174dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("NETWORK_DISCONNECTION"); 3184dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 31996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_NEW_CONNECTION_ATTEMPT: 3204dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("NEW_CONNECTION_ATTEMPT"); 3214dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 32296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_REDUNDANT_CONNECTION_ATTEMPT: 32396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne sb.append("REDUNDANT_CONNECTION_ATTEMPT"); 32496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne break; 32596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_ROAM_TIMEOUT: 32696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne sb.append("ROAM_TIMEOUT"); 32796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne break; 32896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_DHCP: 32996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne sb.append("DHCP"); 3304dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne default: 3314dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("UNKNOWN"); 3324dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 3334dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne } 3341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", connectivityLevelFailureCode="); 3354dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne switch(mConnectionEvent.connectivityLevelFailureCode) { 3364dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne case WifiMetricsProto.ConnectionEvent.HLF_NONE: 3374dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("NONE"); 3384dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 3394dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne case WifiMetricsProto.ConnectionEvent.HLF_DHCP: 3404dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("DHCP"); 3414dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 3424dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne case WifiMetricsProto.ConnectionEvent.HLF_NO_INTERNET: 3434dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("NO_INTERNET"); 3444dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 3454dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne case WifiMetricsProto.ConnectionEvent.HLF_UNWANTED: 3464dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("UNWANTED"); 3474dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 3484dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne default: 3494dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("UNKNOWN"); 3504dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 3514dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne } 3524dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(", signalStrength="); 3534dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(mConnectionEvent.signalStrength); 354ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append(", wifiState="); 355ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne switch(mWifiState) { 356ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_DISABLED: 357ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append("WIFI_DISABLED"); 358ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne break; 359ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_DISCONNECTED: 360ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append("WIFI_DISCONNECTED"); 361ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne break; 362ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_ASSOCIATED: 363ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append("WIFI_ASSOCIATED"); 364ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne break; 365ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne default: 366ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append("WIFI_UNKNOWN"); 367ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne break; 368ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne } 369ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append(", screenOn="); 370ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append(mScreenOn); 371ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append(". mRouterFingerprint: "); 3721b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(mRouterFingerPrint.toString()); 3731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 3741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne return sb.toString(); 3751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 3761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 3771b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 378910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen public WifiMetrics(Clock clock, Looper looper, WifiAwareMetrics awareMetrics) { 379107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne mClock = clock; 3801b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mCurrentConnectionEvent = null; 381ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mScreenOn = true; 382ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mWifiState = WifiMetricsProto.WifiLog.WIFI_DISABLED; 383107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne mRecordStartTimeSec = mClock.getElapsedSinceBootMillis() / 1000; 384910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen mWifiAwareMetrics = awareMetrics; 38546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 38646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mHandler = new Handler(looper) { 38746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public void handleMessage(Message msg) { 38846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne synchronized (mLock) { 38946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne processMessage(msg); 39046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 39146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 39246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne }; 3931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 3941b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 39508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne /** Sets internal WifiConfigManager member */ 39608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne public void setWifiConfigManager(WifiConfigManager wifiConfigManager) { 39708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mWifiConfigManager = wifiConfigManager; 39808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 39908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne 40008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne /** Sets internal WifiNetworkSelector member */ 40108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne public void setWifiNetworkSelector(WifiNetworkSelector wifiNetworkSelector) { 40208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mWifiNetworkSelector = wifiNetworkSelector; 40308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 40408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne 40508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne /** Sets internal PasspointManager member */ 40608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne public void setPasspointManager(PasspointManager passpointManager) { 40708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mPasspointManager = passpointManager; 40808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 40908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne 410c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne // Values used for indexing SystemStateEntries 411c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private static final int SCREEN_ON = 1; 412c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private static final int SCREEN_OFF = 0; 413c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 4141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 4151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Create a new connection event. Call when wifi attempts to make a new network connection 4161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * If there is a current 'un-ended' connection event, it will be ended with UNKNOWN connectivity 4171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * failure code. 4181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Gathers and sets the RouterFingerPrint data as well 4191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 420947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne * @param config WifiConfiguration of the config used for the current connection attempt 4211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param roamType Roam type that caused connection attempt, see WifiMetricsProto.WifiLog.ROAM_X 4221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 42396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public void startConnectionEvent(WifiConfiguration config, String targetBSSID, int roamType) { 4241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 42596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne // Check if this is overlapping another current connection event 42696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne if (mCurrentConnectionEvent != null) { 42796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne //Is this new Connection Event the same as the current one 42896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne if (mCurrentConnectionEvent.mConfigSsid != null 42996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne && mCurrentConnectionEvent.mConfigBssid != null 43096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne && config != null 43196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne && mCurrentConnectionEvent.mConfigSsid.equals(config.SSID) 43296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne && (mCurrentConnectionEvent.mConfigBssid.equals("any") 43396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne || mCurrentConnectionEvent.mConfigBssid.equals(targetBSSID))) { 43496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mCurrentConnectionEvent.mConfigBssid = targetBSSID; 43596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne // End Connection Event due to new connection attempt to the same network 43696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne endConnectionEvent(ConnectionEvent.FAILURE_REDUNDANT_CONNECTION_ATTEMPT, 43796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne WifiMetricsProto.ConnectionEvent.HLF_NONE); 43896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne } else { 43996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne // End Connection Event due to new connection attempt to different network 44096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne endConnectionEvent(ConnectionEvent.FAILURE_NEW_CONNECTION_ATTEMPT, 44196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne WifiMetricsProto.ConnectionEvent.HLF_NONE); 44296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne } 44396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne } 44496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne //If past maximum connection events, start removing the oldest 4454dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne while(mConnectionEventList.size() >= MAX_CONNECTION_EVENTS) { 4464dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mConnectionEventList.remove(0); 4474dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne } 4484dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mCurrentConnectionEvent = new ConnectionEvent(); 4494dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.startTimeMillis = 450107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne mClock.getWallClockMillis(); 45196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mCurrentConnectionEvent.mConfigBssid = targetBSSID; 4524dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.roamType = roamType; 4534dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.updateFromWifiConfiguration(config); 45496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mCurrentConnectionEvent.mConfigBssid = "any"; 455107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne mCurrentConnectionEvent.mRealStartTime = mClock.getElapsedSinceBootMillis(); 456ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mCurrentConnectionEvent.mWifiState = mWifiState; 457ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mCurrentConnectionEvent.mScreenOn = mScreenOn; 4584dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mConnectionEventList.add(mCurrentConnectionEvent); 4595cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mScanResultRssiTimestampMillis = -1; 4605cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne if (config != null) { 4615cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne ScanResult candidate = config.getNetworkSelectionStatus().getCandidate(); 4625cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne if (candidate != null) { 4635cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne // Cache the RSSI of the candidate, as the connection event level is updated 4645cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne // from other sources (polls, bssid_associations) and delta requires the 4655cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne // scanResult rssi 4665cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mScanResultRssi = candidate.level; 4675cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mScanResultRssiTimestampMillis = mClock.getElapsedSinceBootMillis(); 4685cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 4695cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 4701b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 4711b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 4721b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 4731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 4742532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne * set the RoamType of the current ConnectionEvent (if any) 4752532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne */ 4762532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne public void setConnectionEventRoamType(int roamType) { 477ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne synchronized (mLock) { 478ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (mCurrentConnectionEvent != null) { 479ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.roamType = roamType; 480ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } 4812532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 4822532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 483f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne 484f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne /** 485f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne * Set AP related metrics from ScanDetail 486f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne */ 487f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne public void setConnectionScanDetail(ScanDetail scanDetail) { 488ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne synchronized (mLock) { 489ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (mCurrentConnectionEvent != null && scanDetail != null) { 490ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne NetworkDetail networkDetail = scanDetail.getNetworkDetail(); 491ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne ScanResult scanResult = scanDetail.getScanResult(); 492ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne //Ensure that we have a networkDetail, and that it corresponds to the currently 493ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne //tracked connection attempt 494ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (networkDetail != null && scanResult != null 495ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne && mCurrentConnectionEvent.mConfigSsid != null 496ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne && mCurrentConnectionEvent.mConfigSsid 497ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne .equals("\"" + networkDetail.getSSID() + "\"")) { 498ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne updateMetricsFromNetworkDetail(networkDetail); 499ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne updateMetricsFromScanResult(scanResult); 500ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } 501f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne } 502f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne } 503f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne } 504f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne 5052532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne /** 5061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * End a Connection event record. Call when wifi connection attempt succeeds or fails. 5071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * If a Connection event has not been started and is active when .end is called, a new one is 5081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * created with zero duration. 5091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 5101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param level2FailureCode Level 2 failure code returned by supplicant 5111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param connectivityFailureCode WifiMetricsProto.ConnectionEvent.HLF_X 5121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 5131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public void endConnectionEvent(int level2FailureCode, int connectivityFailureCode) { 5141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 5152532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne if (mCurrentConnectionEvent != null) { 5162532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne boolean result = (level2FailureCode == 1) 5172532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne && (connectivityFailureCode == WifiMetricsProto.ConnectionEvent.HLF_NONE); 5182532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.connectionResult = result ? 1 : 0; 519107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne mCurrentConnectionEvent.mRealEndTime = mClock.getElapsedSinceBootMillis(); 5202532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.durationTakenToConnectMillis = (int) 5212532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne (mCurrentConnectionEvent.mRealEndTime 5222532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne - mCurrentConnectionEvent.mRealStartTime); 5232532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.level2FailureCode = level2FailureCode; 5242532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.connectivityLevelFailureCode = 5252532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne connectivityFailureCode; 526f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne // ConnectionEvent already added to ConnectionEvents List. Safe to null current here 5272532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mCurrentConnectionEvent = null; 5285cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne if (!result) { 5295cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mScanResultRssiTimestampMillis = -1; 5305cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 5311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 5352b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne /** 5362b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne * Set ConnectionEvent DTIM Interval (if set), and 802.11 Connection mode, from NetworkDetail 5372b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne */ 5382b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne private void updateMetricsFromNetworkDetail(NetworkDetail networkDetail) { 5392b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne int dtimInterval = networkDetail.getDtimInterval(); 5402b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne if (dtimInterval > 0) { 5412b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.dtim = 5422b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne dtimInterval; 5432b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } 5442b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne int connectionWifiMode; 5452b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne switch (networkDetail.getWifiMode()) { 5462b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne case InformationElementUtil.WifiMode.MODE_UNDEFINED: 5472b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_UNKNOWN; 5482b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 5492b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne case InformationElementUtil.WifiMode.MODE_11A: 5502b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_A; 5512b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 5522b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne case InformationElementUtil.WifiMode.MODE_11B: 5532b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_B; 5542b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 5552b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne case InformationElementUtil.WifiMode.MODE_11G: 5562b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_G; 5572b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 5582b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne case InformationElementUtil.WifiMode.MODE_11N: 5592b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_N; 5602b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 5612b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne case InformationElementUtil.WifiMode.MODE_11AC : 5622b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_AC; 5632b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 5642b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne default: 5652b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_OTHER; 5662b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 5672b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } 5682b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto 5692b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne .routerTechnology = connectionWifiMode; 5702b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } 5712b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne 5722b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne /** 5732b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne * Set ConnectionEvent RSSI and authentication type from ScanResult 5742b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne */ 5752b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne private void updateMetricsFromScanResult(ScanResult scanResult) { 5762b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.signalStrength = scanResult.level; 5772b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication = 5782b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne WifiMetricsProto.RouterFingerPrint.AUTH_OPEN; 57996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mCurrentConnectionEvent.mConfigBssid = scanResult.BSSID; 5802b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne if (scanResult.capabilities != null) { 58159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (ScanResultUtil.isScanResultForWepNetwork(scanResult)) { 5822b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication = 5832b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL; 58459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } else if (ScanResultUtil.isScanResultForPskNetwork(scanResult)) { 5852b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication = 5862b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL; 58759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } else if (ScanResultUtil.isScanResultForEapNetwork(scanResult)) { 5882b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication = 5892b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne WifiMetricsProto.RouterFingerPrint.AUTH_ENTERPRISE; 5902b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } 5912b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } 59296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.channelInfo = 59396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne scanResult.frequency; 5942b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } 5952b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne 5961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne void setIsLocationEnabled(boolean enabled) { 5971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 5981b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.isLocationEnabled = enabled; 5991b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 6001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 6011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 6021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne void setIsScanningAlwaysEnabled(boolean enabled) { 6031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 6041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.isScanningAlwaysEnabled = enabled; 6051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 6061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 6071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 6081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 6091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Increment Non Empty Scan Results count 6101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 6111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public void incrementNonEmptyScanResultCount() { 612c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (DBG) Log.v(TAG, "incrementNonEmptyScanResultCount"); 6131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 6141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.numNonEmptyScanResults++; 6151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 6161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 6171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 6181b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 6191b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Increment Empty Scan Results count 6201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 6211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public void incrementEmptyScanResultCount() { 622c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (DBG) Log.v(TAG, "incrementEmptyScanResultCount"); 6231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 6241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.numEmptyScanResults++; 6251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 6261b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 6271b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 6281b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 629c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * Increment background scan count 630c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 631c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public void incrementBackgroundScanCount() { 632c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (DBG) Log.v(TAG, "incrementBackgroundScanCount"); 633c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne synchronized (mLock) { 634c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.numBackgroundScans++; 635c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 636c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 637c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 638c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 639c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * Get Background scan count 640c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 641c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public int getBackgroundScanCount() { 642c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne synchronized (mLock) { 643c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return mWifiLogProto.numBackgroundScans; 644c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 645c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 646c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 647c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 64870ce5a4cbaf5aaccd4e542e7bb87196fb4464a6eGlen Kuhne * Increment oneshot scan count, and the associated WifiSystemScanStateCount entry 649c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 650c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public void incrementOneshotScanCount() { 651c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne synchronized (mLock) { 652c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.numOneshotScans++; 653c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 65470ce5a4cbaf5aaccd4e542e7bb87196fb4464a6eGlen Kuhne incrementWifiSystemScanStateCount(mWifiState, mScreenOn); 655c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 656c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 657c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 658c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * Get oneshot scan count 659c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 660c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public int getOneshotScanCount() { 661c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne synchronized (mLock) { 662c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return mWifiLogProto.numOneshotScans; 663c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 664c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 665c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 666c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private String returnCodeToString(int scanReturnCode) { 667c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne switch(scanReturnCode){ 668c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.SCAN_UNKNOWN: 669c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "SCAN_UNKNOWN"; 670c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.SCAN_SUCCESS: 671c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "SCAN_SUCCESS"; 672c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.SCAN_FAILURE_INTERRUPTED: 673c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "SCAN_FAILURE_INTERRUPTED"; 674c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.SCAN_FAILURE_INVALID_CONFIGURATION: 675c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "SCAN_FAILURE_INVALID_CONFIGURATION"; 676c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.FAILURE_WIFI_DISABLED: 677c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "FAILURE_WIFI_DISABLED"; 678c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne default: 679c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "<UNKNOWN>"; 680c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 681c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 682c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 683c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 6841b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Increment count of scan return code occurrence 6851b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 6861b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param scanReturnCode Return code from scan attempt WifiMetricsProto.WifiLog.SCAN_X 6871b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 688c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public void incrementScanReturnEntry(int scanReturnCode, int countToAdd) { 6891b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 690c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (DBG) Log.v(TAG, "incrementScanReturnEntry " + returnCodeToString(scanReturnCode)); 691c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne int entry = mScanReturnEntries.get(scanReturnCode); 692c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne entry += countToAdd; 6931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mScanReturnEntries.put(scanReturnCode, entry); 6941b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 6951b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 696c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 697c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * Get the count of this scanReturnCode 698c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * @param scanReturnCode that we are getting the count for 699c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 700c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public int getScanReturnEntry(int scanReturnCode) { 701c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne synchronized (mLock) { 702c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return mScanReturnEntries.get(scanReturnCode); 703c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 704c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 705c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 706c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private String wifiSystemStateToString(int state) { 707c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne switch(state){ 708c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_UNKNOWN: 709c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "WIFI_UNKNOWN"; 710c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_DISABLED: 711c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "WIFI_DISABLED"; 712c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_DISCONNECTED: 713c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "WIFI_DISCONNECTED"; 714c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_ASSOCIATED: 715c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "WIFI_ASSOCIATED"; 716c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne default: 717c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "default"; 718c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 719c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 7201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 7211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 7221b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Increments the count of scans initiated by each wifi state, accounts for screenOn/Off 7231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 7241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param state State of the system when scan was initiated, see WifiMetricsProto.WifiLog.WIFI_X 7251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param screenOn Is the screen on 7261b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 7271b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public void incrementWifiSystemScanStateCount(int state, boolean screenOn) { 7281b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 729c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (DBG) { 730c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne Log.v(TAG, "incrementWifiSystemScanStateCount " + wifiSystemStateToString(state) 731c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + " " + screenOn); 7321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 733c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne int index = (state * 2) + (screenOn ? SCREEN_ON : SCREEN_OFF); 734c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne int entry = mWifiSystemStateEntries.get(index); 735c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne entry++; 736c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiSystemStateEntries.put(index, entry); 737c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 738c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 739c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 740c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 741c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * Get the count of this system State Entry 742c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 743c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public int getSystemStateCount(int state, boolean screenOn) { 744c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne synchronized (mLock) { 745c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne int index = state * 2 + (screenOn ? SCREEN_ON : SCREEN_OFF); 746c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return mWifiSystemStateEntries.get(index); 7471b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 7481b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 7491b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 750ce003b812aead64dcb36647180991150021b24c1Glen Kuhne /** 7515f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * Increment number of times the Watchdog of Last Resort triggered, resetting the wifi stack 7525f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7535f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void incrementNumLastResortWatchdogTriggers() { 7545f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7555f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogTriggers++; 7565f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7575f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7585f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 7595f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * @param count number of networks over bad association threshold when watchdog triggered 7605f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7615f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void addCountToNumLastResortWatchdogBadAssociationNetworksTotal(int count) { 7625f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7635f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal += count; 7645f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7655f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7665f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 7675f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * @param count number of networks over bad authentication threshold when watchdog triggered 7685f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7695f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void addCountToNumLastResortWatchdogBadAuthenticationNetworksTotal(int count) { 7705f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7715f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal += count; 7725f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7735f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7745f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 7755f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * @param count number of networks over bad dhcp threshold when watchdog triggered 7765f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7775f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void addCountToNumLastResortWatchdogBadDhcpNetworksTotal(int count) { 7785f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7795f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal += count; 7805f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7815f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7825f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 7835f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * @param count number of networks over bad other threshold when watchdog triggered 7845f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7855f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void addCountToNumLastResortWatchdogBadOtherNetworksTotal(int count) { 7865f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7875f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal += count; 7885f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7895f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7905f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 7915f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * @param count number of networks seen when watchdog triggered 7925f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7935f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void addCountToNumLastResortWatchdogAvailableNetworksTotal(int count) { 7945f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7955f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal += count; 7965f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7975f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7985f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 7995f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * Increment count of triggers with atleast one bad association network 8005f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 8015f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void incrementNumLastResortWatchdogTriggersWithBadAssociation() { 8025f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 8035f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation++; 8045f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 8055f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 8065f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 8075f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * Increment count of triggers with atleast one bad authentication network 8085f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 8095f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void incrementNumLastResortWatchdogTriggersWithBadAuthentication() { 8105f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 8115f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication++; 8125f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 8135f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 8145f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 8155f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * Increment count of triggers with atleast one bad dhcp network 8165f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 8175f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void incrementNumLastResortWatchdogTriggersWithBadDhcp() { 8185f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 8195f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp++; 8205f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 8215f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 8225f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 8235f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * Increment count of triggers with atleast one bad other network 8245f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 8255f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void incrementNumLastResortWatchdogTriggersWithBadOther() { 8265f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 8275f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogTriggersWithBadOther++; 8285f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 8295f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 8305f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne 8315f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 832ce003b812aead64dcb36647180991150021b24c1Glen Kuhne * Increment number of times connectivity watchdog confirmed pno is working 833ce003b812aead64dcb36647180991150021b24c1Glen Kuhne */ 834ce003b812aead64dcb36647180991150021b24c1Glen Kuhne public void incrementNumConnectivityWatchdogPnoGood() { 835ce003b812aead64dcb36647180991150021b24c1Glen Kuhne synchronized (mLock) { 836ce003b812aead64dcb36647180991150021b24c1Glen Kuhne mWifiLogProto.numConnectivityWatchdogPnoGood++; 837ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 838ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 839ce003b812aead64dcb36647180991150021b24c1Glen Kuhne /** 840ce003b812aead64dcb36647180991150021b24c1Glen Kuhne * Increment number of times connectivity watchdog found pno not working 841ce003b812aead64dcb36647180991150021b24c1Glen Kuhne */ 842ce003b812aead64dcb36647180991150021b24c1Glen Kuhne public void incrementNumConnectivityWatchdogPnoBad() { 843ce003b812aead64dcb36647180991150021b24c1Glen Kuhne synchronized (mLock) { 844ce003b812aead64dcb36647180991150021b24c1Glen Kuhne mWifiLogProto.numConnectivityWatchdogPnoBad++; 845ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 846ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 847ce003b812aead64dcb36647180991150021b24c1Glen Kuhne /** 848ce003b812aead64dcb36647180991150021b24c1Glen Kuhne * Increment number of times connectivity watchdog confirmed background scan is working 849ce003b812aead64dcb36647180991150021b24c1Glen Kuhne */ 850ce003b812aead64dcb36647180991150021b24c1Glen Kuhne public void incrementNumConnectivityWatchdogBackgroundGood() { 851ce003b812aead64dcb36647180991150021b24c1Glen Kuhne synchronized (mLock) { 852ce003b812aead64dcb36647180991150021b24c1Glen Kuhne mWifiLogProto.numConnectivityWatchdogBackgroundGood++; 853ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 854ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 855ce003b812aead64dcb36647180991150021b24c1Glen Kuhne /** 856ce003b812aead64dcb36647180991150021b24c1Glen Kuhne * Increment number of times connectivity watchdog found background scan not working 857ce003b812aead64dcb36647180991150021b24c1Glen Kuhne */ 858ce003b812aead64dcb36647180991150021b24c1Glen Kuhne public void incrementNumConnectivityWatchdogBackgroundBad() { 859ce003b812aead64dcb36647180991150021b24c1Glen Kuhne synchronized (mLock) { 860ce003b812aead64dcb36647180991150021b24c1Glen Kuhne mWifiLogProto.numConnectivityWatchdogBackgroundBad++; 861ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 862ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 863ce003b812aead64dcb36647180991150021b24c1Glen Kuhne 8647a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne /** 86546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Increment various poll related metrics, and cache performance data for StaEvent logging 86646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 86746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public void handlePollResult(WifiInfo wifiInfo) { 86846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mLastPollRssi = wifiInfo.getRssi(); 86946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mLastPollLinkSpeed = wifiInfo.getLinkSpeed(); 87046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mLastPollFreq = wifiInfo.getFrequency(); 87146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne incrementRssiPollRssiCount(mLastPollRssi); 87246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 87346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 87446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 8757a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne * Increment occurence count of RSSI level from RSSI poll. 8767a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne * Ignores rssi values outside the bounds of [MIN_RSSI_POLL, MAX_RSSI_POLL] 8777a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne */ 8787a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne public void incrementRssiPollRssiCount(int rssi) { 8797a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne if (!(rssi >= MIN_RSSI_POLL && rssi <= MAX_RSSI_POLL)) { 8807a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne return; 8817a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne } 8827a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne synchronized (mLock) { 8837a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne int count = mRssiPollCounts.get(rssi); 8847a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne mRssiPollCounts.put(rssi, count + 1); 8855cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne maybeIncrementRssiDeltaCount(rssi - mScanResultRssi); 8865cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 8875cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 8885cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne 8895cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne /** 8905cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * Increment occurence count of difference between scan result RSSI and the first RSSI poll. 8915cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * Ignores rssi values outside the bounds of [MIN_RSSI_DELTA, MAX_RSSI_DELTA] 8925cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * mLock must be held when calling this method. 8935cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne */ 8945cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne private void maybeIncrementRssiDeltaCount(int rssi) { 8955cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne // Check if this RSSI poll is close enough to a scan result RSSI to log a delta value 8965cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne if (mScanResultRssiTimestampMillis >= 0) { 8975cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne long timeDelta = mClock.getElapsedSinceBootMillis() - mScanResultRssiTimestampMillis; 8985cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne if (timeDelta <= TIMEOUT_RSSI_DELTA_MILLIS) { 8995cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne if (rssi >= MIN_RSSI_DELTA && rssi <= MAX_RSSI_DELTA) { 9005cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne int count = mRssiDeltaCounts.get(rssi); 9015cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mRssiDeltaCounts.put(rssi, count + 1); 9025cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 9035cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 9045cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mScanResultRssiTimestampMillis = -1; 9057a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne } 9067a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne } 9077a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne 908da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne /** 9091c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne * Increment count of Watchdog successes. 9101c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne */ 9111c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne public void incrementNumLastResortWatchdogSuccesses() { 9121c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne synchronized (mLock) { 9131c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne mWifiLogProto.numLastResortWatchdogSuccesses++; 9141c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne } 9151c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne } 9161c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne 9171c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne /** 918f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal * Increments the count of alerts by alert reason. 919f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal * 920f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal * @param reason The cause of the alert. The reason values are driver-specific. 921f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal */ 922f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal public void incrementAlertReasonCount(int reason) { 923f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal if (reason > WifiLoggerHal.WIFI_ALERT_REASON_MAX 924f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal || reason < WifiLoggerHal.WIFI_ALERT_REASON_MIN) { 925f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal reason = WifiLoggerHal.WIFI_ALERT_REASON_RESERVED; 926f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 927f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal synchronized (mLock) { 928f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal int alertCount = mWifiAlertReasonCounts.get(reason); 929f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal mWifiAlertReasonCounts.put(reason, alertCount + 1); 930f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 931f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 932f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal 933f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal /** 93459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne * Counts all the different types of networks seen in a set of scan results 93559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne */ 93659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne public void countScanResults(List<ScanDetail> scanDetails) { 93759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (scanDetails == null) { 93859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne return; 93959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 94059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne int totalResults = 0; 94159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne int openNetworks = 0; 94259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne int personalNetworks = 0; 94359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne int enterpriseNetworks = 0; 94459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne int hiddenNetworks = 0; 94559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne int hotspot2r1Networks = 0; 94659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne int hotspot2r2Networks = 0; 94759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne for (ScanDetail scanDetail : scanDetails) { 94859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne NetworkDetail networkDetail = scanDetail.getNetworkDetail(); 94959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne ScanResult scanResult = scanDetail.getScanResult(); 95059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne totalResults++; 95159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (networkDetail != null) { 95259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (networkDetail.isHiddenBeaconFrame()) { 95359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne hiddenNetworks++; 95459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 95559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (networkDetail.getHSRelease() != null) { 95659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R1) { 95759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne hotspot2r1Networks++; 95859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } else if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R2) { 95959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne hotspot2r2Networks++; 96059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 96159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 96259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 96359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (scanResult != null && scanResult.capabilities != null) { 96459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (ScanResultUtil.isScanResultForEapNetwork(scanResult)) { 96559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne enterpriseNetworks++; 96659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } else if (ScanResultUtil.isScanResultForPskNetwork(scanResult) 96759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne || ScanResultUtil.isScanResultForWepNetwork(scanResult)) { 96859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne personalNetworks++; 96959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } else { 97059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne openNetworks++; 97159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 97259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 97359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 97459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne synchronized (mLock) { 97559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numTotalScanResults += totalResults; 97659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numOpenNetworkScanResults += openNetworks; 97759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numPersonalNetworkScanResults += personalNetworks; 97859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numEnterpriseNetworkScanResults += enterpriseNetworks; 97959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numHiddenNetworkScanResults += hiddenNetworks; 98059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numHotspot2R1NetworkScanResults += hotspot2r1Networks; 98159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numHotspot2R2NetworkScanResults += hotspot2r2Networks; 98259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numScans++; 98359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 98459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 98559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne 98659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne /** 9874569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao * Increments occurence of a particular wifi score calculated 9884569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao * in WifiScoreReport by current connected network. Scores are bounded 9894569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao * within [MIN_WIFI_SCORE, MAX_WIFI_SCORE] to limit size of SparseArray 9904569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao */ 9914569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao public void incrementWifiScoreCount(int score) { 9924569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao if (score < MIN_WIFI_SCORE || score > MAX_WIFI_SCORE) { 9934569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao return; 9944569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao } 9954569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao synchronized (mLock) { 9964569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao int count = mWifiScoreCounts.get(score); 9974569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao mWifiScoreCounts.put(score, count + 1); 9984569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao } 9994569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao } 100059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne 100144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein /** 100244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein * Increments occurence of the results from attempting to start SoftAp. 100344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein * Maps the |result| and WifiManager |failureCode| constant to proto defined SoftApStartResult 100444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein * codes. 100544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein */ 100644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein public void incrementSoftApStartResult(boolean result, int failureCode) { 100744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein synchronized (mLock) { 100844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein if (result) { 100944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein int count = mSoftApManagerReturnCodeCounts.get( 101044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_STARTED_SUCCESSFULLY); 101144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mSoftApManagerReturnCodeCounts.put( 101244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_STARTED_SUCCESSFULLY, 101344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein count + 1); 101444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein return; 101544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein } 101644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein 101744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein // now increment failure modes - if not explicitly handled, dump into the general 101844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein // error bucket. 101944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein if (failureCode == WifiManager.SAP_START_FAILURE_NO_CHANNEL) { 102044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein int count = mSoftApManagerReturnCodeCounts.get( 102144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_NO_CHANNEL); 102244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mSoftApManagerReturnCodeCounts.put( 102344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_NO_CHANNEL, 102444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein count + 1); 102544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein } else { 102644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein // failure mode not tracked at this time... count as a general error for now. 102744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein int count = mSoftApManagerReturnCodeCounts.get( 102844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_GENERAL_ERROR); 102944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mSoftApManagerReturnCodeCounts.put( 103044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_GENERAL_ERROR, 103144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein count + 1); 103244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein } 103344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein } 103444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein } 103544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein 1036bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius /** 1037bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius * Increment number of times the HAL crashed. 1038bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius */ 1039bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius public void incrementNumHalCrashes() { 1040bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius synchronized (mLock) { 1041bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius mWifiLogProto.numHalCrashes++; 1042bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius } 1043bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius } 1044bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius 1045bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius /** 1046bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius * Increment number of times the Wificond crashed. 1047bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius */ 1048bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius public void incrementNumWificondCrashes() { 1049bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius synchronized (mLock) { 1050bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius mWifiLogProto.numWificondCrashes++; 1051bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius } 1052bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius } 1053bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius 1054bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius /** 1055bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius * Increment number of times the wifi on failed due to an error in HAL. 1056bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius */ 1057bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius public void incrementNumWifiOnFailureDueToHal() { 1058bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius synchronized (mLock) { 1059bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius mWifiLogProto.numWifiOnFailureDueToHal++; 1060bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius } 1061bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius } 1062bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius 1063bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius /** 1064bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius * Increment number of times the wifi on failed due to an error in wificond. 1065bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius */ 1066bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius public void incrementNumWifiOnFailureDueToWificond() { 1067bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius synchronized (mLock) { 1068bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius mWifiLogProto.numWifiOnFailureDueToWificond++; 1069bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius } 1070bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius } 1071bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius 107226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu /** 107326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu * Increment number of times Passpoint provider being installed. 107426b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu */ 107526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu public void incrementNumPasspointProviderInstallation() { 107626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu synchronized (mLock) { 107726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu mWifiLogProto.numPasspointProviderInstallation++; 107826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu } 107926b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu } 108026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu 108126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu /** 108226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu * Increment number of times Passpoint provider is installed successfully. 108326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu */ 108426b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu public void incrementNumPasspointProviderInstallSuccess() { 108526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu synchronized (mLock) { 108626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu mWifiLogProto.numPasspointProviderInstallSuccess++; 108726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu } 108826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu } 108926b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu 109026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu /** 109126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu * Increment number of times Passpoint provider being uninstalled. 109226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu */ 109326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu public void incrementNumPasspointProviderUninstallation() { 109426b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu synchronized (mLock) { 109526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu mWifiLogProto.numPasspointProviderUninstallation++; 109626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu } 109726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu } 109826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu 109926b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu /** 110026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu * Increment number of times Passpoint provider is uninstalled successfully. 110126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu */ 110226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu public void incrementNumPasspointProviderUninstallSuccess() { 110326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu synchronized (mLock) { 110426b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu mWifiLogProto.numPasspointProviderUninstallSuccess++; 110526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu } 110626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu } 1107bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius 110808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne /** 110908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne * Increment N-Way network selection decision histograms: 111008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne * Counts the size of various sets of scanDetails within a scan, and increment the occurrence 111108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne * of that size for the associated histogram. There are ten histograms generated for each 111208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne * combination of: {SSID, BSSID} *{Total, Saved, Open, Saved_or_Open, Passpoint} 111308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne * Only performs this count if isFullBand is true, otherwise, increments the partial scan count 111408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne */ 111508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne public void incrementAvailableNetworksHistograms(List<ScanDetail> scanDetails, 111608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne boolean isFullBand) { 111708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne synchronized (mLock) { 111808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne if (mWifiConfigManager == null || mWifiNetworkSelector == null 111908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne || mPasspointManager == null) { 112008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne return; 112108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 112208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne if (!isFullBand) { 112308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mWifiLogProto.partialAllSingleScanListenerResults++; 112408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne return; 112508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 112608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne Set<ScanResultMatchInfo> ssids = new HashSet<ScanResultMatchInfo>(); 112708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne int bssids = 0; 112808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne Set<ScanResultMatchInfo> openSsids = new HashSet<ScanResultMatchInfo>(); 112908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne int openBssids = 0; 113008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne Set<ScanResultMatchInfo> savedSsids = new HashSet<ScanResultMatchInfo>(); 113108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne int savedBssids = 0; 113208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne // openOrSavedSsids calculated from union of savedSsids & openSsids 113308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne int openOrSavedBssids = 0; 113408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne Set<PasspointProvider> savedPasspointProviderProfiles = 113508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne new HashSet<PasspointProvider>(); 113608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne int savedPasspointProviderBssids = 0; 113708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne for (ScanDetail scanDetail : scanDetails) { 113808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne NetworkDetail networkDetail = scanDetail.getNetworkDetail(); 113908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne ScanResult scanResult = scanDetail.getScanResult(); 114008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne if (mWifiNetworkSelector.isSignalTooWeak(scanResult)) { 114108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne continue; 114208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 114308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne ScanResultMatchInfo matchInfo = ScanResultMatchInfo.fromScanResult(scanResult); 114408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne Pair<PasspointProvider, PasspointMatch> providerMatch = null; 114508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne PasspointProvider passpointProvider = null; 114608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne if (networkDetail.isInterworking()) { 114708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne providerMatch = 114808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mPasspointManager.matchProvider(scanResult); 114908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne passpointProvider = providerMatch != null ? providerMatch.first : null; 115008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 115108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne ssids.add(matchInfo); 115208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne bssids++; 115308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne boolean isOpen = matchInfo.networkType == ScanResultMatchInfo.NETWORK_TYPE_OPEN; 115408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne WifiConfiguration config = 115508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mWifiConfigManager.getConfiguredNetworkForScanDetail(scanDetail); 115608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne boolean isSaved = (config != null) && !config.isEphemeral() 115708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne && !config.isPasspoint(); 115808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne boolean isSavedPasspoint = passpointProvider != null; 115908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne if (isOpen) { 116008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne openSsids.add(matchInfo); 116108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne openBssids++; 116208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 116308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne if (isSaved) { 116408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne savedSsids.add(matchInfo); 116508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne savedBssids++; 116608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 116708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne if (isOpen || isSaved) { 116808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne openOrSavedBssids++; 116908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne // Calculate openOrSavedSsids union later 117008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 117108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne if (isSavedPasspoint) { 117208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne savedPasspointProviderProfiles.add(passpointProvider); 117308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne savedPasspointProviderBssids++; 117408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 117508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 117608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mWifiLogProto.fullBandAllSingleScanListenerResults++; 117708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne incrementTotalScanSsids(mTotalSsidsInScanHistogram, ssids.size()); 117808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne incrementTotalScanResults(mTotalBssidsInScanHistogram, bssids); 117908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne incrementSsid(mAvailableOpenSsidsInScanHistogram, openSsids.size()); 118008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne incrementBssid(mAvailableOpenBssidsInScanHistogram, openBssids); 118108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne incrementSsid(mAvailableSavedSsidsInScanHistogram, savedSsids.size()); 118208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne incrementBssid(mAvailableSavedBssidsInScanHistogram, savedBssids); 118308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne openSsids.addAll(savedSsids); // openSsids = Union(openSsids, savedSsids) 118408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne incrementSsid(mAvailableOpenOrSavedSsidsInScanHistogram, openSsids.size()); 118508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne incrementBssid(mAvailableOpenOrSavedBssidsInScanHistogram, openOrSavedBssids); 118608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne incrementSsid(mAvailableSavedPasspointProviderProfilesInScanHistogram, 118708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne savedPasspointProviderProfiles.size()); 118808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne incrementBssid(mAvailableSavedPasspointProviderBssidsInScanHistogram, 118908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne savedPasspointProviderBssids); 119008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 119108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 119208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne 119311638f348ba45f9f417928e79b81186cef76c561Glen Kuhne public static final String PROTO_DUMP_ARG = "wifiMetricsProto"; 11949ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne public static final String CLEAN_DUMP_ARG = "clean"; 11959ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne 11961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 11971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Dump all WifiMetrics. Collects some metrics from ConfigStore, Settings and WifiManager 11989ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne * at this time. 11991b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 12001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param fd unused 12011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param pw PrintWriter for writing dump to 12021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param args unused 12031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 12041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 12051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 1206031cdffdaf223772d4ea52569ec7a08d00013208Glen Kuhne if (args != null && args.length > 0 && PROTO_DUMP_ARG.equals(args[0])) { 12079ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne // Dump serialized WifiLog proto 12081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne consolidateProto(true); 12091b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne for (ConnectionEvent event : mConnectionEventList) { 12101b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne if (mCurrentConnectionEvent != event) { 12111b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne //indicate that automatic bug report has been taken for all valid 12121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne //connection events 12131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne event.mConnectionEvent.automaticBugReportTaken = true; 12141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 12151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 12161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne byte[] wifiMetricsProto = WifiMetricsProto.WifiLog.toByteArray(mWifiLogProto); 12171b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne String metricsProtoDump = Base64.encodeToString(wifiMetricsProto, Base64.DEFAULT); 12189ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne if (args.length > 1 && CLEAN_DUMP_ARG.equals(args[1])) { 12199ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne // Output metrics proto bytes (base64) and nothing else 12209ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne pw.print(metricsProtoDump); 12219ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne } else { 12229ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne // Tag the start and end of the metrics proto bytes 12239ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne pw.println("WifiMetrics:"); 12249ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne pw.println(metricsProtoDump); 12259ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne pw.println("EndWifiMetrics"); 12269ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne } 12272532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne clear(); 12281b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } else { 12299ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne pw.println("WifiMetrics:"); 12301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mConnectionEvents:"); 12311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne for (ConnectionEvent event : mConnectionEventList) { 12321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne String eventLine = event.toString(); 12331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne if (event == mCurrentConnectionEvent) { 12341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne eventLine += "CURRENTLY OPEN EVENT"; 12351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 12361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println(eventLine); 12371b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 12381b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mWifiLogProto.numSavedNetworks=" + mWifiLogProto.numSavedNetworks); 12391b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mWifiLogProto.numOpenNetworks=" + mWifiLogProto.numOpenNetworks); 12401b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mWifiLogProto.numPersonalNetworks=" 12411b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne + mWifiLogProto.numPersonalNetworks); 12421b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mWifiLogProto.numEnterpriseNetworks=" 12431b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne + mWifiLogProto.numEnterpriseNetworks); 124459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numHiddenNetworks=" + mWifiLogProto.numHiddenNetworks); 124559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numPasspointNetworks=" 124659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numPasspointNetworks); 12471b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mWifiLogProto.isLocationEnabled=" + mWifiLogProto.isLocationEnabled); 12481b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mWifiLogProto.isScanningAlwaysEnabled=" 12491b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne + mWifiLogProto.isScanningAlwaysEnabled); 1250c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mWifiLogProto.numNetworksAddedByUser=" 1251c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + mWifiLogProto.numNetworksAddedByUser); 1252c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mWifiLogProto.numNetworksAddedByApps=" 1253c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + mWifiLogProto.numNetworksAddedByApps); 1254c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mWifiLogProto.numNonEmptyScanResults=" 1255c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + mWifiLogProto.numNonEmptyScanResults); 1256c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mWifiLogProto.numEmptyScanResults=" 1257c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + mWifiLogProto.numEmptyScanResults); 1258c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mWifiLogProto.numOneshotScans=" 1259c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + mWifiLogProto.numOneshotScans); 1260c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mWifiLogProto.numBackgroundScans=" 1261c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + mWifiLogProto.numBackgroundScans); 1262c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 1263c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mScanReturnEntries:"); 1264c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" SCAN_UNKNOWN: " + getScanReturnEntry( 1265c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne WifiMetricsProto.WifiLog.SCAN_UNKNOWN)); 1266c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" SCAN_SUCCESS: " + getScanReturnEntry( 1267c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne WifiMetricsProto.WifiLog.SCAN_SUCCESS)); 1268c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" SCAN_FAILURE_INTERRUPTED: " + getScanReturnEntry( 1269c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne WifiMetricsProto.WifiLog.SCAN_FAILURE_INTERRUPTED)); 1270c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" SCAN_FAILURE_INVALID_CONFIGURATION: " + getScanReturnEntry( 1271c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne WifiMetricsProto.WifiLog.SCAN_FAILURE_INVALID_CONFIGURATION)); 1272c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" FAILURE_WIFI_DISABLED: " + getScanReturnEntry( 1273c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne WifiMetricsProto.WifiLog.FAILURE_WIFI_DISABLED)); 1274c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 1275c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mSystemStateEntries: <state><screenOn> : <scansInitiated>"); 1276c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_UNKNOWN ON: " 1277c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_UNKNOWN, true)); 1278c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_DISABLED ON: " 1279c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISABLED, true)); 1280c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_DISCONNECTED ON: " 1281c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISCONNECTED, true)); 1282c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_ASSOCIATED ON: " 1283c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_ASSOCIATED, true)); 1284c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_UNKNOWN OFF: " 1285c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_UNKNOWN, false)); 1286c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_DISABLED OFF: " 1287c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISABLED, false)); 1288c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_DISCONNECTED OFF: " 1289c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISCONNECTED, false)); 1290c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_ASSOCIATED OFF: " 1291c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_ASSOCIATED, false)); 1292ce003b812aead64dcb36647180991150021b24c1Glen Kuhne pw.println("mWifiLogProto.numConnectivityWatchdogPnoGood=" 1293ce003b812aead64dcb36647180991150021b24c1Glen Kuhne + mWifiLogProto.numConnectivityWatchdogPnoGood); 1294ce003b812aead64dcb36647180991150021b24c1Glen Kuhne pw.println("mWifiLogProto.numConnectivityWatchdogPnoBad=" 1295ce003b812aead64dcb36647180991150021b24c1Glen Kuhne + mWifiLogProto.numConnectivityWatchdogPnoBad); 1296ce003b812aead64dcb36647180991150021b24c1Glen Kuhne pw.println("mWifiLogProto.numConnectivityWatchdogBackgroundGood=" 1297ce003b812aead64dcb36647180991150021b24c1Glen Kuhne + mWifiLogProto.numConnectivityWatchdogBackgroundGood); 1298ce003b812aead64dcb36647180991150021b24c1Glen Kuhne pw.println("mWifiLogProto.numConnectivityWatchdogBackgroundBad=" 1299ce003b812aead64dcb36647180991150021b24c1Glen Kuhne + mWifiLogProto.numConnectivityWatchdogBackgroundBad); 13005f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogTriggers=" 13015f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogTriggers); 13025f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal=" 13035f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal); 13045f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal=" 13055f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal); 13065f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal=" 13075f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal); 13085f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal=" 13095f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal); 13105f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal=" 13115f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal); 13125f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation=" 13135f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation); 13145f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication=" 13155f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication); 13165f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp=" 13175f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp); 13185f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadOther=" 13195f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogTriggersWithBadOther); 1320da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogSuccesses=" 1321da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne + mWifiLogProto.numLastResortWatchdogSuccesses); 1322107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne pw.println("mWifiLogProto.recordDurationSec=" 1323107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne + ((mClock.getElapsedSinceBootMillis() / 1000) - mRecordStartTimeSec)); 13247a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne pw.println("mWifiLogProto.rssiPollRssiCount: Printing counts for [" + MIN_RSSI_POLL 13257a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne + ", " + MAX_RSSI_POLL + "]"); 13267a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne StringBuilder sb = new StringBuilder(); 13277a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne for (int i = MIN_RSSI_POLL; i <= MAX_RSSI_POLL; i++) { 13287a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne sb.append(mRssiPollCounts.get(i) + " "); 13297a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne } 13307a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne pw.println(" " + sb.toString()); 13315cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne pw.println("mWifiLogProto.rssiPollDeltaCount: Printing counts for [" 13325cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne + MIN_RSSI_DELTA + ", " + MAX_RSSI_DELTA + "]"); 13335cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne sb.setLength(0); 13345cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne for (int i = MIN_RSSI_DELTA; i <= MAX_RSSI_DELTA; i++) { 13355cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne sb.append(mRssiDeltaCounts.get(i) + " "); 13365cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 13375cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne pw.println(" " + sb.toString()); 1338f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal pw.print("mWifiLogProto.alertReasonCounts="); 1339f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal sb.setLength(0); 1340f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal for (int i = WifiLoggerHal.WIFI_ALERT_REASON_MIN; 1341f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal i <= WifiLoggerHal.WIFI_ALERT_REASON_MAX; i++) { 1342f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal int count = mWifiAlertReasonCounts.get(i); 1343f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal if (count > 0) { 1344f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal sb.append("(" + i + "," + count + "),"); 1345f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 1346f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 1347f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal if (sb.length() > 1) { 1348f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal sb.setLength(sb.length() - 1); // strip trailing comma 1349f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal pw.println(sb.toString()); 1350f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } else { 1351f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal pw.println("()"); 1352f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 135359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numTotalScanResults=" 135459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numTotalScanResults); 135559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numOpenNetworkScanResults=" 135659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numOpenNetworkScanResults); 135759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numPersonalNetworkScanResults=" 135859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numPersonalNetworkScanResults); 135959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numEnterpriseNetworkScanResults=" 136059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numEnterpriseNetworkScanResults); 136159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numHiddenNetworkScanResults=" 136259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numHiddenNetworkScanResults); 136359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numHotspot2R1NetworkScanResults=" 136459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numHotspot2R1NetworkScanResults); 136559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numHotspot2R2NetworkScanResults=" 136659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numHotspot2R2NetworkScanResults); 136759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numScans=" + mWifiLogProto.numScans); 13684569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao pw.println("mWifiLogProto.WifiScoreCount: [" + MIN_WIFI_SCORE + ", " 13694569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao + MAX_WIFI_SCORE + "]"); 13704569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao for (int i = 0; i <= MAX_WIFI_SCORE; i++) { 13714569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao pw.print(mWifiScoreCounts.get(i) + " "); 13724569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao } 137344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein pw.println(); // add a line after wifi scores 137444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein pw.println("mWifiLogProto.SoftApManagerReturnCodeCounts:"); 137544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein pw.println(" SUCCESS: " + mSoftApManagerReturnCodeCounts.get( 137644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_STARTED_SUCCESSFULLY)); 137744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein pw.println(" FAILED_GENERAL_ERROR: " + mSoftApManagerReturnCodeCounts.get( 137844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_GENERAL_ERROR)); 137944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein pw.println(" FAILED_NO_CHANNEL: " + mSoftApManagerReturnCodeCounts.get( 138044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_NO_CHANNEL)); 13814569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao pw.print("\n"); 1382bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius pw.println("mWifiLogProto.numHalCrashes=" 1383bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius + mWifiLogProto.numHalCrashes); 1384bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius pw.println("mWifiLogProto.numWificondCrashes=" 1385bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius + mWifiLogProto.numWificondCrashes); 1386bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius pw.println("mWifiLogProto.numWifiOnFailureDueToHal=" 1387bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius + mWifiLogProto.numWifiOnFailureDueToHal); 1388bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius pw.println("mWifiLogProto.numWifiOnFailureDueToWificond=" 1389bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius + mWifiLogProto.numWifiOnFailureDueToWificond); 139046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne pw.println("StaEventList:"); 1391d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne for (StaEventWithTime event : mStaEventList) { 1392d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne pw.println(event); 139346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 1394910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen 139526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu pw.println("mWifiLogProto.numPasspointProviders=" 139626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu + mWifiLogProto.numPasspointProviders); 139726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu pw.println("mWifiLogProto.numPasspointProviderInstallation=" 139826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu + mWifiLogProto.numPasspointProviderInstallation); 139926b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu pw.println("mWifiLogProto.numPasspointProviderInstallSuccess=" 140026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu + mWifiLogProto.numPasspointProviderInstallSuccess); 140126b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu pw.println("mWifiLogProto.numPasspointProviderUninstallation=" 140226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu + mWifiLogProto.numPasspointProviderUninstallation); 140326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu pw.println("mWifiLogProto.numPasspointProviderUninstallSuccess=" 140426b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu + mWifiLogProto.numPasspointProviderUninstallSuccess); 140526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu pw.println("mWifiLogProto.numPasspointProvidersSuccessfullyConnected=" 140626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu + mWifiLogProto.numPasspointProvidersSuccessfullyConnected); 140708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne pw.println("mTotalSsidsInScanHistogram:" 140808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne + mTotalSsidsInScanHistogram.toString()); 140908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne pw.println("mTotalBssidsInScanHistogram:" 141008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne + mTotalBssidsInScanHistogram.toString()); 141108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne pw.println("mAvailableOpenSsidsInScanHistogram:" 141208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne + mAvailableOpenSsidsInScanHistogram.toString()); 141308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne pw.println("mAvailableOpenBssidsInScanHistogram:" 141408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne + mAvailableOpenBssidsInScanHistogram.toString()); 141508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne pw.println("mAvailableSavedSsidsInScanHistogram:" 141608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne + mAvailableSavedSsidsInScanHistogram.toString()); 141708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne pw.println("mAvailableSavedBssidsInScanHistogram:" 141808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne + mAvailableSavedBssidsInScanHistogram.toString()); 141908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne pw.println("mAvailableOpenOrSavedSsidsInScanHistogram:" 142008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne + mAvailableOpenOrSavedSsidsInScanHistogram.toString()); 142108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne pw.println("mAvailableOpenOrSavedBssidsInScanHistogram:" 142208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne + mAvailableOpenOrSavedBssidsInScanHistogram.toString()); 142308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne pw.println("mAvailableSavedPasspointProviderProfilesInScanHistogram:" 142408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne + mAvailableSavedPasspointProviderProfilesInScanHistogram.toString()); 142508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne pw.println("mAvailableSavedPasspointProviderBssidsInScanHistogram:" 142608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne + mAvailableSavedPasspointProviderBssidsInScanHistogram.toString()); 142708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne pw.println("mWifiLogProto.partialAllSingleScanListenerResults=" 142808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne + mWifiLogProto.partialAllSingleScanListenerResults); 142908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne pw.println("mWifiLogProto.fullBandAllSingleScanListenerResults=" 143008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne + mWifiLogProto.fullBandAllSingleScanListenerResults); 1431910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen pw.println("mWifiAwareMetrics:"); 1432910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen mWifiAwareMetrics.dump(fd, pw, args); 14331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 14341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 14351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 14361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 14373c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne /** 14383c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne * Update various counts of saved network types 14393c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne * @param networks List of WifiConfigurations representing all saved networks, must not be null 14403c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne */ 14413c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne public void updateSavedNetworks(List<WifiConfiguration> networks) { 14423c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne synchronized (mLock) { 14433c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numSavedNetworks = networks.size(); 14443c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numOpenNetworks = 0; 14453c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numPersonalNetworks = 0; 14463c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numEnterpriseNetworks = 0; 14473c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numNetworksAddedByUser = 0; 14483c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numNetworksAddedByApps = 0; 14493c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numHiddenNetworks = 0; 14503c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numPasspointNetworks = 0; 14513c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne for (WifiConfiguration config : networks) { 14523c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne if (config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.NONE)) { 14533c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numOpenNetworks++; 14543c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } else if (config.isEnterprise()) { 14553c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numEnterpriseNetworks++; 14563c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } else { 14573c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numPersonalNetworks++; 14583c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } 14593c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne if (config.selfAdded) { 14603c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numNetworksAddedByUser++; 14613c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } else { 14623c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numNetworksAddedByApps++; 14633c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } 14643c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne if (config.hiddenSSID) { 14653c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numHiddenNetworks++; 14663c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } 14673c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne if (config.isPasspoint()) { 14683c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numPasspointNetworks++; 14693c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } 14703c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } 14713c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } 14723c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } 14733c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne 14741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 147549357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu * Update metrics for saved Passpoint profiles. 147626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu * 147726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu * @param numSavedProfiles The number of saved Passpoint profiles 147849357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu * @param numConnectedProfiles The number of saved Passpoint profiles that have ever resulted 147949357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu * in a successful network connection 148026b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu */ 148149357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu public void updateSavedPasspointProfiles(int numSavedProfiles, int numConnectedProfiles) { 148226b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu synchronized (mLock) { 148326b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu mWifiLogProto.numPasspointProviders = numSavedProfiles; 148449357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu mWifiLogProto.numPasspointProvidersSuccessfullyConnected = numConnectedProfiles; 148526b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu } 148626b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu } 148726b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu 148826b97ef6a6d8e755e7db541afa84aacd807599d7Peter Qiu /** 1489c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * append the separate ConnectionEvent, SystemStateEntry and ScanReturnCode collections to their 1490c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * respective lists within mWifiLogProto 14911b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 14921b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param incremental Only include ConnectionEvents created since last automatic bug report 14931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 14941b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private void consolidateProto(boolean incremental) { 14951b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne List<WifiMetricsProto.ConnectionEvent> events = new ArrayList<>(); 14967a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne List<WifiMetricsProto.RssiPollCount> rssis = new ArrayList<>(); 14975cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne List<WifiMetricsProto.RssiPollCount> rssiDeltas = new ArrayList<>(); 1498f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal List<WifiMetricsProto.AlertReasonCount> alertReasons = new ArrayList<>(); 14994569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao List<WifiMetricsProto.WifiScoreCount> scores = new ArrayList<>(); 15001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 15011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne for (ConnectionEvent event : mConnectionEventList) { 1502c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne // If this is not incremental, dump full ConnectionEvent list 1503c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne // Else Dump all un-dumped events except for the current one 15041b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne if (!incremental || ((mCurrentConnectionEvent != event) 15051b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne && !event.mConnectionEvent.automaticBugReportTaken)) { 15061b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne //Get all ConnectionEvents that haven not been dumped as a proto, also exclude 15071b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne //the current active un-ended connection event 15081b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne events.add(event.mConnectionEvent); 1509c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (incremental) { 1510c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne event.mConnectionEvent.automaticBugReportTaken = true; 1511c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 15121b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 15131b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 15141b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne if (events.size() > 0) { 15151b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.connectionEvent = events.toArray(mWifiLogProto.connectionEvent); 15161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 1517c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 1518c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne //Convert the SparseIntArray of scanReturnEntry integers into ScanReturnEntry proto list 1519c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.scanReturnEntries = 1520c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne new WifiMetricsProto.WifiLog.ScanReturnEntry[mScanReturnEntries.size()]; 1521c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne for (int i = 0; i < mScanReturnEntries.size(); i++) { 1522c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.scanReturnEntries[i] = new WifiMetricsProto.WifiLog.ScanReturnEntry(); 1523c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.scanReturnEntries[i].scanReturnCode = mScanReturnEntries.keyAt(i); 1524c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.scanReturnEntries[i].scanResultsCount = mScanReturnEntries.valueAt(i); 1525c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 1526c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 1527c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne // Convert the SparseIntArray of systemStateEntry into WifiSystemStateEntry proto list 1528c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne // This one is slightly more complex, as the Sparse are indexed with: 1529c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne // key: wifiState * 2 + isScreenOn, value: wifiStateCount 1530c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.wifiSystemStateEntries = 1531c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne new WifiMetricsProto.WifiLog 1532c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne .WifiSystemStateEntry[mWifiSystemStateEntries.size()]; 1533c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne for (int i = 0; i < mWifiSystemStateEntries.size(); i++) { 1534c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.wifiSystemStateEntries[i] = 1535c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne new WifiMetricsProto.WifiLog.WifiSystemStateEntry(); 1536c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.wifiSystemStateEntries[i].wifiState = 1537c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiSystemStateEntries.keyAt(i) / 2; 1538c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.wifiSystemStateEntries[i].wifiStateCount = 1539c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiSystemStateEntries.valueAt(i); 1540c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.wifiSystemStateEntries[i].isScreenOn = 1541c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne (mWifiSystemStateEntries.keyAt(i) % 2) > 0; 1542c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 1543107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne mWifiLogProto.recordDurationSec = (int) ((mClock.getElapsedSinceBootMillis() / 1000) 1544107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne - mRecordStartTimeSec); 15457a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne 15467a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne /** 15477a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne * Convert the SparseIntArray of RSSI poll rssi's and counts to the proto's repeated 15487a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne * IntKeyVal array. 15497a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne */ 15507a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne for (int i = 0; i < mRssiPollCounts.size(); i++) { 15517a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne WifiMetricsProto.RssiPollCount keyVal = new WifiMetricsProto.RssiPollCount(); 15527a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne keyVal.rssi = mRssiPollCounts.keyAt(i); 15537a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne keyVal.count = mRssiPollCounts.valueAt(i); 15547a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne rssis.add(keyVal); 15557a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne } 15567a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne mWifiLogProto.rssiPollRssiCount = rssis.toArray(mWifiLogProto.rssiPollRssiCount); 1557f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal 1558f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal /** 15595cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * Convert the SparseIntArray of RSSI delta rssi's and counts to the proto's repeated 15605cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * IntKeyVal array. 15615cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne */ 15625cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne for (int i = 0; i < mRssiDeltaCounts.size(); i++) { 15635cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne WifiMetricsProto.RssiPollCount keyVal = new WifiMetricsProto.RssiPollCount(); 15645cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne keyVal.rssi = mRssiDeltaCounts.keyAt(i); 15655cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne keyVal.count = mRssiDeltaCounts.valueAt(i); 15665cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne rssiDeltas.add(keyVal); 15675cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 15685cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mWifiLogProto.rssiPollDeltaCount = rssiDeltas.toArray(mWifiLogProto.rssiPollDeltaCount); 15695cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne 15705cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne /** 1571f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal * Convert the SparseIntArray of alert reasons and counts to the proto's repeated 1572f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal * IntKeyVal array. 1573f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal */ 1574f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal for (int i = 0; i < mWifiAlertReasonCounts.size(); i++) { 1575f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal WifiMetricsProto.AlertReasonCount keyVal = new WifiMetricsProto.AlertReasonCount(); 1576f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal keyVal.reason = mWifiAlertReasonCounts.keyAt(i); 1577f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal keyVal.count = mWifiAlertReasonCounts.valueAt(i); 1578f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal alertReasons.add(keyVal); 1579f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 1580f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal mWifiLogProto.alertReasonCount = alertReasons.toArray(mWifiLogProto.alertReasonCount); 15814569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao 15824569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao /** 15834569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao * Convert the SparseIntArray of Wifi Score and counts to proto's repeated 15844569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao * IntKeyVal array. 15854569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao */ 15864569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao for (int score = 0; score < mWifiScoreCounts.size(); score++) { 15874569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao WifiMetricsProto.WifiScoreCount keyVal = new WifiMetricsProto.WifiScoreCount(); 15884569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao keyVal.score = mWifiScoreCounts.keyAt(score); 15894569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao keyVal.count = mWifiScoreCounts.valueAt(score); 15904569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao scores.add(keyVal); 15914569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao } 15924569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao mWifiLogProto.wifiScoreCount = scores.toArray(mWifiLogProto.wifiScoreCount); 159344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein 159444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein /** 159544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein * Convert the SparseIntArray of SoftAp Return codes and counts to proto's repeated 159644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein * IntKeyVal array. 159744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein */ 159844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein int codeCounts = mSoftApManagerReturnCodeCounts.size(); 159944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mWifiLogProto.softApReturnCode = new WifiMetricsProto.SoftApReturnCodeCount[codeCounts]; 160044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein for (int sapCode = 0; sapCode < codeCounts; sapCode++) { 160144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mWifiLogProto.softApReturnCode[sapCode] = 160244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein new WifiMetricsProto.SoftApReturnCodeCount(); 160344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mWifiLogProto.softApReturnCode[sapCode].startResult = 160444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mSoftApManagerReturnCodeCounts.keyAt(sapCode); 160544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mWifiLogProto.softApReturnCode[sapCode].count = 160644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mSoftApManagerReturnCodeCounts.valueAt(sapCode); 160744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein } 1608d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne 1609d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne /** 1610d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne * Convert StaEventList to array of StaEvents 1611d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne */ 1612d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne mWifiLogProto.staEventList = new StaEvent[mStaEventList.size()]; 1613d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne for (int i = 0; i < mStaEventList.size(); i++) { 1614d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne mWifiLogProto.staEventList[i] = mStaEventList.get(i).staEvent; 1615d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne } 161608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mWifiLogProto.totalSsidsInScanHistogram = 161708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne makeNumConnectableNetworksBucketArray(mTotalSsidsInScanHistogram); 161808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mWifiLogProto.totalBssidsInScanHistogram = 161908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne makeNumConnectableNetworksBucketArray(mTotalBssidsInScanHistogram); 162008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mWifiLogProto.availableOpenSsidsInScanHistogram = 162108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne makeNumConnectableNetworksBucketArray(mAvailableOpenSsidsInScanHistogram); 162208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mWifiLogProto.availableOpenBssidsInScanHistogram = 162308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne makeNumConnectableNetworksBucketArray(mAvailableOpenBssidsInScanHistogram); 162408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mWifiLogProto.availableSavedSsidsInScanHistogram = 162508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne makeNumConnectableNetworksBucketArray(mAvailableSavedSsidsInScanHistogram); 162608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mWifiLogProto.availableSavedBssidsInScanHistogram = 162708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne makeNumConnectableNetworksBucketArray(mAvailableSavedBssidsInScanHistogram); 162808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mWifiLogProto.availableOpenOrSavedSsidsInScanHistogram = 162908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne makeNumConnectableNetworksBucketArray( 163008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mAvailableOpenOrSavedSsidsInScanHistogram); 163108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mWifiLogProto.availableOpenOrSavedBssidsInScanHistogram = 163208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne makeNumConnectableNetworksBucketArray( 163308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mAvailableOpenOrSavedBssidsInScanHistogram); 163408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mWifiLogProto.availableSavedPasspointProviderProfilesInScanHistogram = 163508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne makeNumConnectableNetworksBucketArray( 163608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mAvailableSavedPasspointProviderProfilesInScanHistogram); 163708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mWifiLogProto.availableSavedPasspointProviderBssidsInScanHistogram = 163808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne makeNumConnectableNetworksBucketArray( 163908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mAvailableSavedPasspointProviderBssidsInScanHistogram); 1640910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen mWifiLogProto.wifiAwareLog = mWifiAwareMetrics.consolidateProto(); 1641ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } 16421b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 16432532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne 164408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private WifiMetricsProto.NumConnectableNetworksBucket[] makeNumConnectableNetworksBucketArray( 164508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne SparseIntArray sia) { 164608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne WifiMetricsProto.NumConnectableNetworksBucket[] array = 164708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne new WifiMetricsProto.NumConnectableNetworksBucket[sia.size()]; 164808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne for (int i = 0; i < sia.size(); i++) { 164908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne WifiMetricsProto.NumConnectableNetworksBucket keyVal = 165008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne new WifiMetricsProto.NumConnectableNetworksBucket(); 165108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne keyVal.numConnectableNetworks = sia.keyAt(i); 165208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne keyVal.count = sia.valueAt(i); 165308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne array[i] = keyVal; 165408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 165508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne return array; 165608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 165708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne 16582532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne /** 16592532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne * Clear all WifiMetrics, except for currentConnectionEvent. 16602532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne */ 16612532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne private void clear() { 16622532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne synchronized (mLock) { 16632532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mConnectionEventList.clear(); 16642532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne if (mCurrentConnectionEvent != null) { 16652532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mConnectionEventList.add(mCurrentConnectionEvent); 16662532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 16672532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mScanReturnEntries.clear(); 16682532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mWifiSystemStateEntries.clear(); 1669107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne mRecordStartTimeSec = mClock.getElapsedSinceBootMillis() / 1000; 16707a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne mRssiPollCounts.clear(); 16715cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mRssiDeltaCounts.clear(); 1672f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal mWifiAlertReasonCounts.clear(); 16734569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao mWifiScoreCounts.clear(); 16742532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mWifiLogProto.clear(); 16755cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mScanResultRssiTimestampMillis = -1; 167644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mSoftApManagerReturnCodeCounts.clear(); 167746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mStaEventList.clear(); 1678910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen mWifiAwareMetrics.clear(); 167908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mTotalSsidsInScanHistogram.clear(); 168008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mTotalBssidsInScanHistogram.clear(); 168108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mAvailableOpenSsidsInScanHistogram.clear(); 168208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mAvailableOpenBssidsInScanHistogram.clear(); 168308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mAvailableSavedSsidsInScanHistogram.clear(); 168408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mAvailableSavedBssidsInScanHistogram.clear(); 168508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mAvailableOpenOrSavedSsidsInScanHistogram.clear(); 168608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mAvailableOpenOrSavedBssidsInScanHistogram.clear(); 168708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mAvailableSavedPasspointProviderProfilesInScanHistogram.clear(); 168808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne mAvailableSavedPasspointProviderBssidsInScanHistogram.clear(); 16892532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 16902532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 1691ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne 1692ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne /** 1693ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne * Set screen state (On/Off) 1694ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne */ 1695ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne public void setScreenState(boolean screenOn) { 1696ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne synchronized (mLock) { 1697ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mScreenOn = screenOn; 1698ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne } 1699ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne } 1700ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne 1701ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne /** 1702ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne * Set wifi state (WIFI_UNKNOWN, WIFI_DISABLED, WIFI_DISCONNECTED, WIFI_ASSOCIATED) 1703ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne */ 1704ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne public void setWifiState(int wifiState) { 1705ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne synchronized (mLock) { 1706ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mWifiState = wifiState; 1707ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne } 1708ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne } 170946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 171046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 171146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Message handler for interesting WifiMonitor messages. Generates StaEvents 171246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 171346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private void processMessage(Message msg) { 171446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne StaEvent event = new StaEvent(); 171546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne boolean logEvent = true; 171646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne switch (msg.what) { 171746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiMonitor.ASSOCIATION_REJECTION_EVENT: 171846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.type = StaEvent.TYPE_ASSOCIATION_REJECTION_EVENT; 171946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.associationTimedOut = msg.arg1 > 0 ? true : false; 172046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.status = msg.arg2; 172146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 172246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiMonitor.AUTHENTICATION_FAILURE_EVENT: 172346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.type = StaEvent.TYPE_AUTHENTICATION_FAILURE_EVENT; 172446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne switch (msg.arg2) { 172546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiManager.ERROR_AUTH_FAILURE_NONE: 172646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.authFailureReason = StaEvent.AUTH_FAILURE_NONE; 172746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 172846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiManager.ERROR_AUTH_FAILURE_TIMEOUT: 172946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.authFailureReason = StaEvent.AUTH_FAILURE_TIMEOUT; 173046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 173146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiManager.ERROR_AUTH_FAILURE_WRONG_PSWD: 173246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.authFailureReason = StaEvent.AUTH_FAILURE_WRONG_PSWD; 173346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 173446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiManager.ERROR_AUTH_FAILURE_EAP_FAILURE: 173546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.authFailureReason = StaEvent.AUTH_FAILURE_EAP_FAILURE; 173646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 173746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne default: 173846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 173946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 174046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 174146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiMonitor.NETWORK_CONNECTION_EVENT: 174246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.type = StaEvent.TYPE_NETWORK_CONNECTION_EVENT; 174346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 174446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiMonitor.NETWORK_DISCONNECTION_EVENT: 174546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.type = StaEvent.TYPE_NETWORK_DISCONNECTION_EVENT; 174646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.reason = msg.arg2; 174746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.localGen = msg.arg1 == 0 ? false : true; 174846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 174946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT: 175046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne logEvent = false; 175146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne StateChangeResult stateChangeResult = (StateChangeResult) msg.obj; 175246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mSupplicantStateChangeBitmask |= supplicantStateToBit(stateChangeResult.state); 175346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 175446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiStateMachine.CMD_ASSOCIATED_BSSID: 175546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.type = StaEvent.TYPE_CMD_ASSOCIATED_BSSID; 175646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 175746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiStateMachine.CMD_TARGET_BSSID: 175846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.type = StaEvent.TYPE_CMD_TARGET_BSSID; 175946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 176046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne default: 176146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return; 176246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 176346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (logEvent) { 176446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne addStaEvent(event); 176546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 176646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 176746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 176846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Log a StaEvent from WifiStateMachine. The StaEvent must not be one of the supplicant 176946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * generated event types, which are logged through 'sendMessage' 177046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * @param type StaEvent.EventType describing the event 177146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 177246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public void logStaEvent(int type) { 177346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne logStaEvent(type, StaEvent.DISCONNECT_UNKNOWN, null); 177446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 177546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 177646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Log a StaEvent from WifiStateMachine. The StaEvent must not be one of the supplicant 177746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * generated event types, which are logged through 'sendMessage' 177846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * @param type StaEvent.EventType describing the event 177946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * @param config WifiConfiguration for a framework initiated connection attempt 178046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 178146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public void logStaEvent(int type, WifiConfiguration config) { 178246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne logStaEvent(type, StaEvent.DISCONNECT_UNKNOWN, config); 178346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 178446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 178546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Log a StaEvent from WifiStateMachine. The StaEvent must not be one of the supplicant 178646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * generated event types, which are logged through 'sendMessage' 178746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * @param type StaEvent.EventType describing the event 178846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * @param frameworkDisconnectReason StaEvent.FrameworkDisconnectReason explaining why framework 178946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * initiated a FRAMEWORK_DISCONNECT 179046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 179146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public void logStaEvent(int type, int frameworkDisconnectReason) { 179246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne logStaEvent(type, frameworkDisconnectReason, null); 179346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 179446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 179546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Log a StaEvent from WifiStateMachine. The StaEvent must not be one of the supplicant 179646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * generated event types, which are logged through 'sendMessage' 179746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * @param type StaEvent.EventType describing the event 179846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * @param frameworkDisconnectReason StaEvent.FrameworkDisconnectReason explaining why framework 179946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * initiated a FRAMEWORK_DISCONNECT 180046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * @param config WifiConfiguration for a framework initiated connection attempt 180146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 180246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public void logStaEvent(int type, int frameworkDisconnectReason, WifiConfiguration config) { 180346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne switch (type) { 180446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_IP_CONFIGURATION_SUCCESSFUL: 180546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_IP_CONFIGURATION_LOST: 180646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_IP_REACHABILITY_LOST: 180746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_START_CONNECT: 180846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_START_ROAM: 180946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CONNECT_NETWORK: 181046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_NETWORK_AGENT_VALID_NETWORK: 181146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_FRAMEWORK_DISCONNECT: 181246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 181346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne default: 181446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne Log.e(TAG, "Unknown StaEvent:" + type); 181546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return; 181646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 181746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne StaEvent event = new StaEvent(); 181846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.type = type; 181946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (frameworkDisconnectReason != StaEvent.DISCONNECT_UNKNOWN) { 182046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.frameworkDisconnectReason = frameworkDisconnectReason; 182146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 182246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.configInfo = createConfigInfo(config); 182346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne addStaEvent(event); 182446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 182546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 182646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private void addStaEvent(StaEvent staEvent) { 182746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne staEvent.startTimeMillis = mClock.getElapsedSinceBootMillis(); 182846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne staEvent.lastRssi = mLastPollRssi; 182946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne staEvent.lastFreq = mLastPollFreq; 183046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne staEvent.lastLinkSpeed = mLastPollLinkSpeed; 183146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne staEvent.supplicantStateChangesBitmask = mSupplicantStateChangeBitmask; 183246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mSupplicantStateChangeBitmask = 0; 183346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mLastPollRssi = -127; 183446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mLastPollFreq = -1; 183546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mLastPollLinkSpeed = -1; 1836d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne mStaEventList.add(new StaEventWithTime(staEvent, mClock.getWallClockMillis())); 183746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne // Prune StaEventList if it gets too long 183846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (mStaEventList.size() > MAX_STA_EVENTS) mStaEventList.remove(); 183946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 184046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 184146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private ConfigInfo createConfigInfo(WifiConfiguration config) { 184246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (config == null) return null; 184346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne ConfigInfo info = new ConfigInfo(); 184446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.allowedKeyManagement = bitSetToInt(config.allowedKeyManagement); 184546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.allowedProtocols = bitSetToInt(config.allowedProtocols); 184646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.allowedAuthAlgorithms = bitSetToInt(config.allowedAuthAlgorithms); 184746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.allowedPairwiseCiphers = bitSetToInt(config.allowedPairwiseCiphers); 184846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.allowedGroupCiphers = bitSetToInt(config.allowedGroupCiphers); 184946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.hiddenSsid = config.hiddenSSID; 185046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.isPasspoint = config.isPasspoint(); 185146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.isEphemeral = config.isEphemeral(); 185246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.hasEverConnected = config.getNetworkSelectionStatus().getHasEverConnected(); 185346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne ScanResult candidate = config.getNetworkSelectionStatus().getCandidate(); 185446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (candidate != null) { 185546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.scanRssi = candidate.level; 185646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.scanFreq = candidate.frequency; 185746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 185846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return info; 185946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 186046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 186146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public Handler getHandler() { 186246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return mHandler; 186346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 186446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 1865910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen public WifiAwareMetrics getWifiAwareMetrics() { 1866910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen return mWifiAwareMetrics; 1867910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen } 1868910fdc720f0bf62b5529cb37a5f001ae585a5c59Etan Cohen 186946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne // Rather than generate a StaEvent for each SUPPLICANT_STATE_CHANGE, cache these in a bitmask 187046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne // and attach it to the next event which is generated. 187146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private int mSupplicantStateChangeBitmask = 0; 187246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 187346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 187446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Converts a SupplicantState value to a single bit, with position defined by 187546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * {@code StaEvent.SupplicantState} 187646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 187746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public static int supplicantStateToBit(SupplicantState state) { 187846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne switch(state) { 187946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case DISCONNECTED: 188046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_DISCONNECTED; 188146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case INTERFACE_DISABLED: 188246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_INTERFACE_DISABLED; 188346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case INACTIVE: 188446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_INACTIVE; 188546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case SCANNING: 188646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_SCANNING; 188746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case AUTHENTICATING: 188846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_AUTHENTICATING; 188946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case ASSOCIATING: 189046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_ASSOCIATING; 189146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case ASSOCIATED: 189246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_ASSOCIATED; 189346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case FOUR_WAY_HANDSHAKE: 189446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_FOUR_WAY_HANDSHAKE; 189546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case GROUP_HANDSHAKE: 189646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_GROUP_HANDSHAKE; 189746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case COMPLETED: 189846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_COMPLETED; 189946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case DORMANT: 190046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_DORMANT; 190146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case UNINITIALIZED: 190246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_UNINITIALIZED; 190346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case INVALID: 190446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_INVALID; 190546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne default: 190646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne Log.wtf(TAG, "Got unknown supplicant state: " + state.ordinal()); 190746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 0; 190846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 190946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 191046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 191146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static String supplicantStateChangesBitmaskToString(int mask) { 191246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne StringBuilder sb = new StringBuilder(); 1913d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append("supplicantStateChangeEvents: {"); 191446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_DISCONNECTED)) > 0) sb.append(" DISCONNECTED"); 191546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_INTERFACE_DISABLED)) > 0) sb.append(" INTERFACE_DISABLED"); 191646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_INACTIVE)) > 0) sb.append(" INACTIVE"); 191746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_SCANNING)) > 0) sb.append(" SCANNING"); 191846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_AUTHENTICATING)) > 0) sb.append(" AUTHENTICATING"); 191946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_ASSOCIATING)) > 0) sb.append(" ASSOCIATING"); 192046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_ASSOCIATED)) > 0) sb.append(" ASSOCIATED"); 192146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_FOUR_WAY_HANDSHAKE)) > 0) sb.append(" FOUR_WAY_HANDSHAKE"); 192246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_GROUP_HANDSHAKE)) > 0) sb.append(" GROUP_HANDSHAKE"); 192346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_COMPLETED)) > 0) sb.append(" COMPLETED"); 192446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_DORMANT)) > 0) sb.append(" DORMANT"); 192546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_UNINITIALIZED)) > 0) sb.append(" UNINITIALIZED"); 192646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_INVALID)) > 0) sb.append(" INVALID"); 192746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne sb.append("}"); 192846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return sb.toString(); 192946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 193046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 193146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 193246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Returns a human readable string from a Sta Event. Only adds information relevant to the event 193346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * type. 193446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 193546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public static String staEventToString(StaEvent event) { 193646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (event == null) return "<NULL>"; 193746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne StringBuilder sb = new StringBuilder(); 193846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne switch (event.type) { 193946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_ASSOCIATION_REJECTION_EVENT: 1940d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append("ASSOCIATION_REJECTION_EVENT") 194146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" timedOut=").append(event.associationTimedOut) 194246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" status=").append(event.status).append(":") 194346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(ISupplicantStaIfaceCallback.StatusCode.toString(event.status)); 194446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 194546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_AUTHENTICATION_FAILURE_EVENT: 1946d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append("AUTHENTICATION_FAILURE_EVENT reason=").append(event.authFailureReason) 194746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(":").append(authFailureReasonToString(event.authFailureReason)); 194846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 194946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_NETWORK_CONNECTION_EVENT: 1950d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append("NETWORK_CONNECTION_EVENT"); 195146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 195246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_NETWORK_DISCONNECTION_EVENT: 1953d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append("NETWORK_DISCONNECTION_EVENT") 195446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" local_gen=").append(event.localGen) 195546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" reason=").append(event.reason).append(":") 195646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(ISupplicantStaIfaceCallback.ReasonCode.toString( 195746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne (event.reason >= 0 ? event.reason : -1 * event.reason))); 195846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 195946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_ASSOCIATED_BSSID: 1960d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append("CMD_ASSOCIATED_BSSID"); 196146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 196246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_IP_CONFIGURATION_SUCCESSFUL: 1963d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append("CMD_IP_CONFIGURATION_SUCCESSFUL"); 196446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 196546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_IP_CONFIGURATION_LOST: 1966d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append("CMD_IP_CONFIGURATION_LOST"); 196746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 196846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_IP_REACHABILITY_LOST: 1969d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append("CMD_IP_REACHABILITY_LOST"); 197046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 197146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_TARGET_BSSID: 1972d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append("CMD_TARGET_BSSID"); 197346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 197446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_START_CONNECT: 1975d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append("CMD_START_CONNECT"); 197646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 197746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_START_ROAM: 1978d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append("CMD_START_ROAM"); 197946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 198046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CONNECT_NETWORK: 1981d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append("CONNECT_NETWORK"); 198246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 198346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_NETWORK_AGENT_VALID_NETWORK: 1984d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append("NETWORK_AGENT_VALID_NETWORK"); 198546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 198646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_FRAMEWORK_DISCONNECT: 1987d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append("FRAMEWORK_DISCONNECT") 198846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" reason=") 198946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(frameworkDisconnectReasonToString(event.frameworkDisconnectReason)); 199046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 199146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne default: 199246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne sb.append("UNKNOWN " + event.type + ":"); 199346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 199446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 199546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (event.lastRssi != -127) sb.append(" lastRssi=").append(event.lastRssi); 199646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (event.lastFreq != -1) sb.append(" lastFreq=").append(event.lastFreq); 199746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (event.lastLinkSpeed != -1) sb.append(" lastLinkSpeed=").append(event.lastLinkSpeed); 199846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (event.supplicantStateChangesBitmask != 0) { 1999d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append(", ").append(supplicantStateChangesBitmaskToString( 200046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.supplicantStateChangesBitmask)); 200146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 200246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (event.configInfo != null) { 2003d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append(", ").append(configInfoToString(event.configInfo)); 200446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 200546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 200646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return sb.toString(); 200746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 200846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 200946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static String authFailureReasonToString(int authFailureReason) { 201046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne switch (authFailureReason) { 201146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.AUTH_FAILURE_NONE: 201246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "ERROR_AUTH_FAILURE_NONE"; 201346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.AUTH_FAILURE_TIMEOUT: 201446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "ERROR_AUTH_FAILURE_TIMEOUT"; 201546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.AUTH_FAILURE_WRONG_PSWD: 201646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "ERROR_AUTH_FAILURE_WRONG_PSWD"; 201746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.AUTH_FAILURE_EAP_FAILURE: 201846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "ERROR_AUTH_FAILURE_EAP_FAILURE"; 201946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne default: 202046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return ""; 202146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 202246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 202346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 202446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static String frameworkDisconnectReasonToString(int frameworkDisconnectReason) { 202546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne switch (frameworkDisconnectReason) { 202646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.DISCONNECT_API: 202746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "DISCONNECT_API"; 202846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.DISCONNECT_GENERIC: 202946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "DISCONNECT_GENERIC"; 203046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.DISCONNECT_UNWANTED: 203146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "DISCONNECT_UNWANTED"; 203246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.DISCONNECT_ROAM_WATCHDOG_TIMER: 203346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "DISCONNECT_ROAM_WATCHDOG_TIMER"; 203446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.DISCONNECT_P2P_DISCONNECT_WIFI_REQUEST: 203546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "DISCONNECT_P2P_DISCONNECT_WIFI_REQUEST"; 203646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.DISCONNECT_RESET_SIM_NETWORKS: 203746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "DISCONNECT_RESET_SIM_NETWORKS"; 203846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne default: 203946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "DISCONNECT_UNKNOWN=" + frameworkDisconnectReason; 204046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 204146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 204246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 204346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static String configInfoToString(ConfigInfo info) { 204446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne StringBuilder sb = new StringBuilder(); 204546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne sb.append("ConfigInfo:") 204646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" allowed_key_management=").append(info.allowedKeyManagement) 204746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" allowed_protocols=").append(info.allowedProtocols) 204846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" allowed_auth_algorithms=").append(info.allowedAuthAlgorithms) 204946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" allowed_pairwise_ciphers=").append(info.allowedPairwiseCiphers) 205046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" allowed_group_ciphers=").append(info.allowedGroupCiphers) 205146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" hidden_ssid=").append(info.hiddenSsid) 205246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" is_passpoint=").append(info.isPasspoint) 205346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" is_ephemeral=").append(info.isEphemeral) 205446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" has_ever_connected=").append(info.hasEverConnected) 205546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" scan_rssi=").append(info.scanRssi) 205646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" scan_freq=").append(info.scanFreq); 205746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return sb.toString(); 205846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 205946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 206046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public static final int MAX_STA_EVENTS = 512; 2061d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne private LinkedList<StaEventWithTime> mStaEventList = new LinkedList<StaEventWithTime>(); 206246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private int mLastPollRssi = -127; 206346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private int mLastPollLinkSpeed = -1; 206446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private int mLastPollFreq = -1; 206546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 206646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 206746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Converts the first 31 bits of a BitSet to a little endian int 206846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 206946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static int bitSetToInt(BitSet bits) { 207046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne int value = 0; 207146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne int nBits = bits.length() < 31 ? bits.length() : 31; 207246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne for (int i = 0; i < nBits; i++) { 207346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne value += bits.get(i) ? (1 << i) : 0; 207446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 207546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return value; 207646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 207708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private void incrementSsid(SparseIntArray sia, int element) { 207808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne increment(sia, Math.min(element, MAX_CONNECTABLE_SSID_NETWORK_BUCKET)); 207908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 208008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private void incrementBssid(SparseIntArray sia, int element) { 208108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne increment(sia, Math.min(element, MAX_CONNECTABLE_BSSID_NETWORK_BUCKET)); 208208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 208308631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private void incrementTotalScanResults(SparseIntArray sia, int element) { 208408631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne increment(sia, Math.min(element, MAX_TOTAL_SCAN_RESULTS_BUCKET)); 208508631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 208608631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private void incrementTotalScanSsids(SparseIntArray sia, int element) { 208708631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne increment(sia, Math.min(element, MAX_TOTAL_SCAN_RESULT_SSIDS_BUCKET)); 208808631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 208908631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne private void increment(SparseIntArray sia, int element) { 209008631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne int count = sia.get(element); 209108631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne sia.put(element, count + 1); 209208631913ff641047b1d56288bd194a1fa7c390e1Glen Kuhne } 2093d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne 2094d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne private static class StaEventWithTime { 2095d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne public StaEvent staEvent; 2096d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne public long wallClockMillis; 2097d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne 2098d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne StaEventWithTime(StaEvent event, long wallClockMillis) { 2099d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne staEvent = event; 2100d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne this.wallClockMillis = wallClockMillis; 2101d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne } 2102d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne 2103d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne public String toString() { 2104d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne StringBuilder sb = new StringBuilder(); 2105d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne Calendar c = Calendar.getInstance(); 2106d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne c.setTimeInMillis(wallClockMillis); 2107d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne if (wallClockMillis != 0) { 2108d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append(String.format("%tm-%td %tH:%tM:%tS.%tL", c, c, c, c, c, c)); 2109d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne } else { 2110d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append(" "); 2111d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne } 2112d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne sb.append(" ").append(staEventToString(staEvent)); 2113d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne return sb.toString(); 2114d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne } 2115d582c6dfdbb3989b8b761a6cba608a0a3ce35df2Glen Kuhne } 21161b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne} 2117