WifiMetrics.java revision bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ec
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; 31c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhneimport android.util.SparseIntArray; 321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 33f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhneimport com.android.server.wifi.hotspot2.NetworkDetail; 34da94688198c864bb29be2e9603ebbe9ae6492a87Tamas Berghammerimport com.android.server.wifi.nano.WifiMetricsProto; 3546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport com.android.server.wifi.nano.WifiMetricsProto.StaEvent; 3646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport com.android.server.wifi.nano.WifiMetricsProto.StaEvent.ConfigInfo; 37f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhneimport com.android.server.wifi.util.InformationElementUtil; 3859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhneimport com.android.server.wifi.util.ScanResultUtil; 39f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne 401b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.io.FileDescriptor; 411b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.io.PrintWriter; 421b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.ArrayList; 4346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport java.util.BitSet; 441b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.Calendar; 4546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhneimport java.util.LinkedList; 461b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhneimport java.util.List; 471b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 481b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne/** 491b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Provides storage for wireless connectivity metrics, as they are generated. 501b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Metrics logged by this class include: 511b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Aggregated connection stats (num of connections, num of failures, ...) 521b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Discrete connection event stats (time, duration, failure codes, ...) 531b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Router details (technology type, authentication type, ...) 541b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Scan stats 551b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 561b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhnepublic class WifiMetrics { 571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private static final String TAG = "WifiMetrics"; 58c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private static final boolean DBG = false; 597a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne /** 607a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne * Clamp the RSSI poll counts to values between [MIN,MAX]_RSSI_POLL 617a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne */ 627a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne private static final int MAX_RSSI_POLL = 0; 637a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne private static final int MIN_RSSI_POLL = -127; 645cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne public static final int MAX_RSSI_DELTA = 127; 655cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne public static final int MIN_RSSI_DELTA = -127; 665cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne /** Maximum time period between ScanResult and RSSI poll to generate rssi delta datapoint */ 675cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne public static final long TIMEOUT_RSSI_DELTA_MILLIS = 3000; 684569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao private static final int MIN_WIFI_SCORE = 0; 694569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao private static final int MAX_WIFI_SCORE = NetworkAgent.WIFI_BASE_SCORE; 701b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private final Object mLock = new Object(); 712532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne private static final int MAX_CONNECTION_EVENTS = 256; 72107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne private Clock mClock; 73ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne private boolean mScreenOn; 74ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne private int mWifiState; 7546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private Handler mHandler; 761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 771b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Metrics are stored within an instance of the WifiLog proto during runtime, 781b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * The ConnectionEvent, SystemStateEntries & ScanReturnEntries metrics are stored during 791b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * runtime in member lists of this WifiMetrics class, with the final WifiLog proto being pieced 801b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * together at dump-time 811b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 827a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne private final WifiMetricsProto.WifiLog mWifiLogProto = new WifiMetricsProto.WifiLog(); 831b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 841b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Session information that gets logged for every Wifi connection attempt. 851b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 867a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne private final List<ConnectionEvent> mConnectionEventList = new ArrayList<>(); 871b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 881b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * The latest started (but un-ended) connection attempt 891b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 901b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private ConnectionEvent mCurrentConnectionEvent; 911b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 921b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Count of number of times each scan return code, indexed by WifiLog.ScanReturnCode 931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 947a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne private final SparseIntArray mScanReturnEntries = new SparseIntArray(); 951b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Mapping of system state to the counts of scans requested in that wifi state * screenOn 971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * combination. Indexed by WifiLog.WifiState * (1 + screenOn) 981b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 997a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne private final SparseIntArray mWifiSystemStateEntries = new SparseIntArray(); 100f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal /** Mapping of RSSI values to counts. */ 101f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal private final SparseIntArray mRssiPollCounts = new SparseIntArray(); 1025cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne /** Mapping of RSSI scan-poll delta values to counts. */ 1035cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne private final SparseIntArray mRssiDeltaCounts = new SparseIntArray(); 1045cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne /** RSSI of the scan result for the last connection event*/ 1055cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne private int mScanResultRssi = 0; 1065cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne /** Boot-relative timestamp when the last candidate scanresult was received, used to calculate 1075cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne RSSI deltas. -1 designates no candidate scanResult being tracked */ 1085cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne private long mScanResultRssiTimestampMillis = -1; 109f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal /** Mapping of alert reason to the respective alert count. */ 110f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal private final SparseIntArray mWifiAlertReasonCounts = new SparseIntArray(); 111107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne /** 112107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne * Records the getElapsedSinceBootMillis (in seconds) that represents the beginning of data 113107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne * capture for for this WifiMetricsProto 114107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne */ 115107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne private long mRecordStartTimeSec; 1164569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao /** Mapping of Wifi Scores to counts */ 1174569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao private final SparseIntArray mWifiScoreCounts = new SparseIntArray(); 11844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein /** Mapping of SoftApManager start SoftAp return codes to counts */ 11944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein private final SparseIntArray mSoftApManagerReturnCodeCounts = new SparseIntArray(); 1201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne class RouterFingerPrint { 1211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private WifiMetricsProto.RouterFingerPrint mRouterFingerPrintProto; 1222532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne RouterFingerPrint() { 1231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mRouterFingerPrintProto = new WifiMetricsProto.RouterFingerPrint(); 1241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 1251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 1261b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public String toString() { 1271b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne StringBuilder sb = new StringBuilder(); 1281b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 1291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append("mConnectionEvent.roamType=" + mRouterFingerPrintProto.roamType); 1301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", mChannelInfo=" + mRouterFingerPrintProto.channelInfo); 1311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", mDtim=" + mRouterFingerPrintProto.dtim); 1321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", mAuthentication=" + mRouterFingerPrintProto.authentication); 1331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", mHidden=" + mRouterFingerPrintProto.hidden); 1341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", mRouterTechnology=" + mRouterFingerPrintProto.routerTechnology); 1351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", mSupportsIpv6=" + mRouterFingerPrintProto.supportsIpv6); 1361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 1371b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne return sb.toString(); 1381b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 1392532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne public void updateFromWifiConfiguration(WifiConfiguration config) { 140ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne synchronized (mLock) { 141ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (config != null) { 142ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // Is this a hidden network 143ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mRouterFingerPrintProto.hidden = config.hiddenSSID; 144ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // Config may not have a valid dtimInterval set yet, in which case dtim will be zero 145ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // (These are only populated from beacon frame scan results, which are returned as 146ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // scan results from the chip far less frequently than Probe-responses) 147ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (config.dtimInterval > 0) { 148ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mRouterFingerPrintProto.dtim = config.dtimInterval; 149ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } 150ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mCurrentConnectionEvent.mConfigSsid = config.SSID; 151ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // Get AuthType information from config (We do this again from ScanResult after 152ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // associating with BSSID) 153ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (config.allowedKeyManagement != null 154ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne && config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.NONE)) { 155ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto 156ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_OPEN; 157ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } else if (config.isEnterprise()) { 158ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto 159ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_ENTERPRISE; 160ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } else { 161ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto 162ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne .authentication = WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL; 163ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } 16459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto 16559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne .passpoint = config.isPasspoint(); 166ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // If there's a ScanResult candidate associated with this config already, get it and 167ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne // log (more accurate) metrics from it 168ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne ScanResult candidate = config.getNetworkSelectionStatus().getCandidate(); 169ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (candidate != null) { 170ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne updateMetricsFromScanResult(candidate); 171ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } 17296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne } 1732532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 1742532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 1751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 1761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 1771b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 1781b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Log event, tracking the start time, end time and result of a wireless connection attempt. 1791b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 1801b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne class ConnectionEvent { 1811b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne WifiMetricsProto.ConnectionEvent mConnectionEvent; 18296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne //<TODO> Move these constants into a wifi.proto Enum, and create a new Failure Type field 18396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne //covering more than just l2 failures. see b/27652362 18496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne /** 18596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne * Failure codes, used for the 'level_2_failure_code' Connection event field (covers a lot 18696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne * more failures than just l2 though, since the proto does not have a place to log 18796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne * framework failures) 18896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne */ 1892532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne // Failure is unknown 19096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_UNKNOWN = 0; 1912532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne // NONE 19296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_NONE = 1; 1932532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne // ASSOCIATION_REJECTION_EVENT 19496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_ASSOCIATION_REJECTION = 2; 1952532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne // AUTHENTICATION_FAILURE_EVENT 19696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_AUTHENTICATION_FAILURE = 3; 1972532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne // SSID_TEMP_DISABLED (Also Auth failure) 19896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_SSID_TEMP_DISABLED = 4; 1994dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne // reconnect() or reassociate() call to WifiNative failed 20096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_CONNECT_NETWORK_FAILED = 5; 2012532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne // NETWORK_DISCONNECTION_EVENT 20296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_NETWORK_DISCONNECTION = 6; 2034dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne // NEW_CONNECTION_ATTEMPT before previous finished 20496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_NEW_CONNECTION_ATTEMPT = 7; 20596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne // New connection attempt to the same network & bssid 20696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_REDUNDANT_CONNECTION_ATTEMPT = 8; 20796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne // Roam Watchdog timer triggered (Roaming timed out) 20896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_ROAM_TIMEOUT = 9; 20996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne // DHCP failure 21096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public static final int FAILURE_DHCP = 10; 21196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne 2124dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne RouterFingerPrint mRouterFingerPrint; 2134dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne private long mRealStartTime; 2144dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne private long mRealEndTime; 2154dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne private String mConfigSsid; 2164dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne private String mConfigBssid; 217ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne private int mWifiState; 218ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne private boolean mScreenOn; 2192532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne 2201b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private ConnectionEvent() { 2211b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mConnectionEvent = new WifiMetricsProto.ConnectionEvent(); 222947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne mRealEndTime = 0; 223947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne mRealStartTime = 0; 2242532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mRouterFingerPrint = new RouterFingerPrint(); 2252532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mConnectionEvent.routerFingerprint = mRouterFingerPrint.mRouterFingerPrintProto; 2264dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mConfigSsid = "<NULL>"; 2274dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mConfigBssid = "<NULL>"; 228ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mWifiState = WifiMetricsProto.WifiLog.WIFI_UNKNOWN; 229ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mScreenOn = false; 2301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 2311b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 2321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public String toString() { 2331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne StringBuilder sb = new StringBuilder(); 2341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append("startTime="); 2351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne Calendar c = Calendar.getInstance(); 2361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 2371b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne c.setTimeInMillis(mConnectionEvent.startTimeMillis); 2381b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(mConnectionEvent.startTimeMillis == 0 ? " <null>" : 2391b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne String.format("%tm-%td %tH:%tM:%tS.%tL", c, c, c, c, c, c)); 2404dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(", SSID="); 2414dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(mConfigSsid); 2424dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(", BSSID="); 2434dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(mConfigBssid); 2444dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(", durationMillis="); 2451b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(mConnectionEvent.durationTakenToConnectMillis); 2462532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append(", roamType="); 2474dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne switch(mConnectionEvent.roamType) { 2482532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne case 1: 2492532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append("ROAM_NONE"); 2502532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne break; 2512532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne case 2: 2522532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append("ROAM_DBDC"); 2532532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne break; 2542532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne case 3: 2552532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append("ROAM_ENTERPRISE"); 2562532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne break; 2572532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne case 4: 2582532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append("ROAM_USER_SELECTED"); 2592532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne break; 2602532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne case 5: 2612532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append("ROAM_UNRELATED"); 2622532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne break; 2632532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne default: 2642532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne sb.append("ROAM_UNKNOWN"); 2652532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 2664dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(", connectionResult="); 2674dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(mConnectionEvent.connectionResult); 2681b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", level2FailureCode="); 2694dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne switch(mConnectionEvent.level2FailureCode) { 27096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_NONE: 2714dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("NONE"); 2724dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 27396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_ASSOCIATION_REJECTION: 2744dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("ASSOCIATION_REJECTION"); 2754dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 27696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_AUTHENTICATION_FAILURE: 2774dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("AUTHENTICATION_FAILURE"); 2784dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 27996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_SSID_TEMP_DISABLED: 2804dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("SSID_TEMP_DISABLED"); 2814dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 28296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_CONNECT_NETWORK_FAILED: 2834dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("CONNECT_NETWORK_FAILED"); 2844dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 28596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_NETWORK_DISCONNECTION: 2864dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("NETWORK_DISCONNECTION"); 2874dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 28896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_NEW_CONNECTION_ATTEMPT: 2894dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("NEW_CONNECTION_ATTEMPT"); 2904dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 29196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_REDUNDANT_CONNECTION_ATTEMPT: 29296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne sb.append("REDUNDANT_CONNECTION_ATTEMPT"); 29396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne break; 29496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_ROAM_TIMEOUT: 29596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne sb.append("ROAM_TIMEOUT"); 29696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne break; 29796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne case FAILURE_DHCP: 29896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne sb.append("DHCP"); 2994dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne default: 3004dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("UNKNOWN"); 3014dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 3024dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne } 3031b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(", connectivityLevelFailureCode="); 3044dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne switch(mConnectionEvent.connectivityLevelFailureCode) { 3054dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne case WifiMetricsProto.ConnectionEvent.HLF_NONE: 3064dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("NONE"); 3074dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 3084dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne case WifiMetricsProto.ConnectionEvent.HLF_DHCP: 3094dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("DHCP"); 3104dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 3114dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne case WifiMetricsProto.ConnectionEvent.HLF_NO_INTERNET: 3124dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("NO_INTERNET"); 3134dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 3144dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne case WifiMetricsProto.ConnectionEvent.HLF_UNWANTED: 3154dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("UNWANTED"); 3164dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 3174dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne default: 3184dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append("UNKNOWN"); 3194dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne break; 3204dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne } 3214dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(", signalStrength="); 3224dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne sb.append(mConnectionEvent.signalStrength); 323ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append(", wifiState="); 324ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne switch(mWifiState) { 325ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_DISABLED: 326ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append("WIFI_DISABLED"); 327ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne break; 328ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_DISCONNECTED: 329ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append("WIFI_DISCONNECTED"); 330ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne break; 331ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_ASSOCIATED: 332ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append("WIFI_ASSOCIATED"); 333ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne break; 334ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne default: 335ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append("WIFI_UNKNOWN"); 336ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne break; 337ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne } 338ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append(", screenOn="); 339ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append(mScreenOn); 340ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne sb.append(". mRouterFingerprint: "); 3411b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne sb.append(mRouterFingerPrint.toString()); 3421b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 3431b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne return sb.toString(); 3441b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 3451b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 3461b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 34746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public WifiMetrics(Clock clock, Looper looper) { 348107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne mClock = clock; 3491b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mCurrentConnectionEvent = null; 350ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mScreenOn = true; 351ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mWifiState = WifiMetricsProto.WifiLog.WIFI_DISABLED; 352107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne mRecordStartTimeSec = mClock.getElapsedSinceBootMillis() / 1000; 35346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 35446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mHandler = new Handler(looper) { 35546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public void handleMessage(Message msg) { 35646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne synchronized (mLock) { 35746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne processMessage(msg); 35846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 35946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 36046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne }; 3611b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 3621b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 363c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne // Values used for indexing SystemStateEntries 364c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private static final int SCREEN_ON = 1; 365c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private static final int SCREEN_OFF = 0; 366c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 3671b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 3681b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Create a new connection event. Call when wifi attempts to make a new network connection 3691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * If there is a current 'un-ended' connection event, it will be ended with UNKNOWN connectivity 3701b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * failure code. 3711b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Gathers and sets the RouterFingerPrint data as well 3721b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 373947e55415eab3989f2f5cede0c03745cf9268309Glen Kuhne * @param config WifiConfiguration of the config used for the current connection attempt 3741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param roamType Roam type that caused connection attempt, see WifiMetricsProto.WifiLog.ROAM_X 3751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 37696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne public void startConnectionEvent(WifiConfiguration config, String targetBSSID, int roamType) { 3771b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 37896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne // Check if this is overlapping another current connection event 37996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne if (mCurrentConnectionEvent != null) { 38096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne //Is this new Connection Event the same as the current one 38196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne if (mCurrentConnectionEvent.mConfigSsid != null 38296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne && mCurrentConnectionEvent.mConfigBssid != null 38396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne && config != null 38496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne && mCurrentConnectionEvent.mConfigSsid.equals(config.SSID) 38596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne && (mCurrentConnectionEvent.mConfigBssid.equals("any") 38696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne || mCurrentConnectionEvent.mConfigBssid.equals(targetBSSID))) { 38796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mCurrentConnectionEvent.mConfigBssid = targetBSSID; 38896cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne // End Connection Event due to new connection attempt to the same network 38996cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne endConnectionEvent(ConnectionEvent.FAILURE_REDUNDANT_CONNECTION_ATTEMPT, 39096cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne WifiMetricsProto.ConnectionEvent.HLF_NONE); 39196cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne } else { 39296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne // End Connection Event due to new connection attempt to different network 39396cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne endConnectionEvent(ConnectionEvent.FAILURE_NEW_CONNECTION_ATTEMPT, 39496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne WifiMetricsProto.ConnectionEvent.HLF_NONE); 39596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne } 39696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne } 39796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne //If past maximum connection events, start removing the oldest 3984dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne while(mConnectionEventList.size() >= MAX_CONNECTION_EVENTS) { 3994dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mConnectionEventList.remove(0); 4004dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne } 4014dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mCurrentConnectionEvent = new ConnectionEvent(); 4024dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.startTimeMillis = 403107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne mClock.getWallClockMillis(); 40496cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mCurrentConnectionEvent.mConfigBssid = targetBSSID; 4054dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.roamType = roamType; 4064dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.updateFromWifiConfiguration(config); 40796cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mCurrentConnectionEvent.mConfigBssid = "any"; 408107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne mCurrentConnectionEvent.mRealStartTime = mClock.getElapsedSinceBootMillis(); 409ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mCurrentConnectionEvent.mWifiState = mWifiState; 410ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mCurrentConnectionEvent.mScreenOn = mScreenOn; 4114dead162c5336443e9d7b3deae5eb26b07d39254Glen Kuhne mConnectionEventList.add(mCurrentConnectionEvent); 4125cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mScanResultRssiTimestampMillis = -1; 4135cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne if (config != null) { 4145cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne ScanResult candidate = config.getNetworkSelectionStatus().getCandidate(); 4155cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne if (candidate != null) { 4165cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne // Cache the RSSI of the candidate, as the connection event level is updated 4175cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne // from other sources (polls, bssid_associations) and delta requires the 4185cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne // scanResult rssi 4195cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mScanResultRssi = candidate.level; 4205cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mScanResultRssiTimestampMillis = mClock.getElapsedSinceBootMillis(); 4215cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 4225cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 4231b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 4241b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 4251b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 4261b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 4272532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne * set the RoamType of the current ConnectionEvent (if any) 4282532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne */ 4292532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne public void setConnectionEventRoamType(int roamType) { 430ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne synchronized (mLock) { 431ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (mCurrentConnectionEvent != null) { 432ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.roamType = roamType; 433ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } 4342532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 4352532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 436f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne 437f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne /** 438f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne * Set AP related metrics from ScanDetail 439f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne */ 440f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne public void setConnectionScanDetail(ScanDetail scanDetail) { 441ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne synchronized (mLock) { 442ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (mCurrentConnectionEvent != null && scanDetail != null) { 443ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne NetworkDetail networkDetail = scanDetail.getNetworkDetail(); 444ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne ScanResult scanResult = scanDetail.getScanResult(); 445ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne //Ensure that we have a networkDetail, and that it corresponds to the currently 446ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne //tracked connection attempt 447ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne if (networkDetail != null && scanResult != null 448ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne && mCurrentConnectionEvent.mConfigSsid != null 449ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne && mCurrentConnectionEvent.mConfigSsid 450ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne .equals("\"" + networkDetail.getSSID() + "\"")) { 451ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne updateMetricsFromNetworkDetail(networkDetail); 452ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne updateMetricsFromScanResult(scanResult); 453ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } 454f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne } 455f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne } 456f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne } 457f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne 4582532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne /** 4591b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * End a Connection event record. Call when wifi connection attempt succeeds or fails. 4601b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * If a Connection event has not been started and is active when .end is called, a new one is 4611b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * created with zero duration. 4621b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 4631b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param level2FailureCode Level 2 failure code returned by supplicant 4641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param connectivityFailureCode WifiMetricsProto.ConnectionEvent.HLF_X 4651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 4661b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public void endConnectionEvent(int level2FailureCode, int connectivityFailureCode) { 4671b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 4682532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne if (mCurrentConnectionEvent != null) { 4692532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne boolean result = (level2FailureCode == 1) 4702532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne && (connectivityFailureCode == WifiMetricsProto.ConnectionEvent.HLF_NONE); 4712532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.connectionResult = result ? 1 : 0; 472107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne mCurrentConnectionEvent.mRealEndTime = mClock.getElapsedSinceBootMillis(); 4732532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.durationTakenToConnectMillis = (int) 4742532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne (mCurrentConnectionEvent.mRealEndTime 4752532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne - mCurrentConnectionEvent.mRealStartTime); 4762532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.level2FailureCode = level2FailureCode; 4772532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.connectivityLevelFailureCode = 4782532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne connectivityFailureCode; 479f5cc6a0c7ede374b33de1cf5156bf149e2e76c13Glen Kuhne // ConnectionEvent already added to ConnectionEvents List. Safe to null current here 4802532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mCurrentConnectionEvent = null; 4815cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne if (!result) { 4825cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mScanResultRssiTimestampMillis = -1; 4835cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 4841b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 4851b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 4861b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 4871b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 4882b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne /** 4892b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne * Set ConnectionEvent DTIM Interval (if set), and 802.11 Connection mode, from NetworkDetail 4902b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne */ 4912b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne private void updateMetricsFromNetworkDetail(NetworkDetail networkDetail) { 4922b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne int dtimInterval = networkDetail.getDtimInterval(); 4932b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne if (dtimInterval > 0) { 4942b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.dtim = 4952b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne dtimInterval; 4962b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } 4972b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne int connectionWifiMode; 4982b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne switch (networkDetail.getWifiMode()) { 4992b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne case InformationElementUtil.WifiMode.MODE_UNDEFINED: 5002b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_UNKNOWN; 5012b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 5022b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne case InformationElementUtil.WifiMode.MODE_11A: 5032b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_A; 5042b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 5052b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne case InformationElementUtil.WifiMode.MODE_11B: 5062b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_B; 5072b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 5082b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne case InformationElementUtil.WifiMode.MODE_11G: 5092b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_G; 5102b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 5112b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne case InformationElementUtil.WifiMode.MODE_11N: 5122b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_N; 5132b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 5142b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne case InformationElementUtil.WifiMode.MODE_11AC : 5152b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_AC; 5162b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 5172b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne default: 5182b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne connectionWifiMode = WifiMetricsProto.RouterFingerPrint.ROUTER_TECH_OTHER; 5192b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne break; 5202b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } 5212b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto 5222b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne .routerTechnology = connectionWifiMode; 5232b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } 5242b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne 5252b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne /** 5262b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne * Set ConnectionEvent RSSI and authentication type from ScanResult 5272b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne */ 5282b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne private void updateMetricsFromScanResult(ScanResult scanResult) { 5292b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mConnectionEvent.signalStrength = scanResult.level; 5302b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication = 5312b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne WifiMetricsProto.RouterFingerPrint.AUTH_OPEN; 53296cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mCurrentConnectionEvent.mConfigBssid = scanResult.BSSID; 5332b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne if (scanResult.capabilities != null) { 53459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (ScanResultUtil.isScanResultForWepNetwork(scanResult)) { 5352b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication = 5362b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL; 53759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } else if (ScanResultUtil.isScanResultForPskNetwork(scanResult)) { 5382b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication = 5392b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne WifiMetricsProto.RouterFingerPrint.AUTH_PERSONAL; 54059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } else if (ScanResultUtil.isScanResultForEapNetwork(scanResult)) { 5412b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.authentication = 5422b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne WifiMetricsProto.RouterFingerPrint.AUTH_ENTERPRISE; 5432b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } 5442b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } 54596cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne mCurrentConnectionEvent.mRouterFingerPrint.mRouterFingerPrintProto.channelInfo = 54696cdfc0acafef88832515ecc52c01638c1493211Glen Kuhne scanResult.frequency; 5472b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne } 5482b152feb1c574f30557581770d4f8c06c770ba34Glen Kuhne 5491b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne void setIsLocationEnabled(boolean enabled) { 5501b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 5511b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.isLocationEnabled = enabled; 5521b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5531b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5541b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 5551b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne void setIsScanningAlwaysEnabled(boolean enabled) { 5561b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 5571b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.isScanningAlwaysEnabled = enabled; 5581b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5591b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5601b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 5611b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 5621b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Increment Non Empty Scan Results count 5631b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 5641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public void incrementNonEmptyScanResultCount() { 565c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (DBG) Log.v(TAG, "incrementNonEmptyScanResultCount"); 5661b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 5671b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.numNonEmptyScanResults++; 5681b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5701b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 5711b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 5721b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Increment Empty Scan Results count 5731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 5741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public void incrementEmptyScanResultCount() { 575c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (DBG) Log.v(TAG, "incrementEmptyScanResultCount"); 5761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 5771b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.numEmptyScanResults++; 5781b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5791b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 5801b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 5811b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 582c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * Increment background scan count 583c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 584c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public void incrementBackgroundScanCount() { 585c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (DBG) Log.v(TAG, "incrementBackgroundScanCount"); 586c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne synchronized (mLock) { 587c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.numBackgroundScans++; 588c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 589c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 590c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 591c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 592c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * Get Background scan count 593c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 594c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public int getBackgroundScanCount() { 595c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne synchronized (mLock) { 596c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return mWifiLogProto.numBackgroundScans; 597c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 598c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 599c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 600c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 60170ce5a4cbaf5aaccd4e542e7bb87196fb4464a6eGlen Kuhne * Increment oneshot scan count, and the associated WifiSystemScanStateCount entry 602c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 603c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public void incrementOneshotScanCount() { 604c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne synchronized (mLock) { 605c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.numOneshotScans++; 606c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 60770ce5a4cbaf5aaccd4e542e7bb87196fb4464a6eGlen Kuhne incrementWifiSystemScanStateCount(mWifiState, mScreenOn); 608c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 609c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 610c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 611c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * Get oneshot scan count 612c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 613c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public int getOneshotScanCount() { 614c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne synchronized (mLock) { 615c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return mWifiLogProto.numOneshotScans; 616c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 617c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 618c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 619c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private String returnCodeToString(int scanReturnCode) { 620c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne switch(scanReturnCode){ 621c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.SCAN_UNKNOWN: 622c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "SCAN_UNKNOWN"; 623c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.SCAN_SUCCESS: 624c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "SCAN_SUCCESS"; 625c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.SCAN_FAILURE_INTERRUPTED: 626c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "SCAN_FAILURE_INTERRUPTED"; 627c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.SCAN_FAILURE_INVALID_CONFIGURATION: 628c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "SCAN_FAILURE_INVALID_CONFIGURATION"; 629c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.FAILURE_WIFI_DISABLED: 630c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "FAILURE_WIFI_DISABLED"; 631c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne default: 632c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "<UNKNOWN>"; 633c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 634c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 635c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 636c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 6371b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Increment count of scan return code occurrence 6381b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 6391b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param scanReturnCode Return code from scan attempt WifiMetricsProto.WifiLog.SCAN_X 6401b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 641c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public void incrementScanReturnEntry(int scanReturnCode, int countToAdd) { 6421b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 643c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (DBG) Log.v(TAG, "incrementScanReturnEntry " + returnCodeToString(scanReturnCode)); 644c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne int entry = mScanReturnEntries.get(scanReturnCode); 645c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne entry += countToAdd; 6461b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mScanReturnEntries.put(scanReturnCode, entry); 6471b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 6481b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 649c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 650c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * Get the count of this scanReturnCode 651c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * @param scanReturnCode that we are getting the count for 652c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 653c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public int getScanReturnEntry(int scanReturnCode) { 654c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne synchronized (mLock) { 655c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return mScanReturnEntries.get(scanReturnCode); 656c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 657c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 658c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 659c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne private String wifiSystemStateToString(int state) { 660c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne switch(state){ 661c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_UNKNOWN: 662c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "WIFI_UNKNOWN"; 663c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_DISABLED: 664c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "WIFI_DISABLED"; 665c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_DISCONNECTED: 666c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "WIFI_DISCONNECTED"; 667c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne case WifiMetricsProto.WifiLog.WIFI_ASSOCIATED: 668c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "WIFI_ASSOCIATED"; 669c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne default: 670c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return "default"; 671c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 672c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 6731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 6741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 6751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Increments the count of scans initiated by each wifi state, accounts for screenOn/Off 6761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 6771b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param state State of the system when scan was initiated, see WifiMetricsProto.WifiLog.WIFI_X 6781b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param screenOn Is the screen on 6791b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 6801b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public void incrementWifiSystemScanStateCount(int state, boolean screenOn) { 6811b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 682c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (DBG) { 683c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne Log.v(TAG, "incrementWifiSystemScanStateCount " + wifiSystemStateToString(state) 684c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + " " + screenOn); 6851b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 686c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne int index = (state * 2) + (screenOn ? SCREEN_ON : SCREEN_OFF); 687c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne int entry = mWifiSystemStateEntries.get(index); 688c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne entry++; 689c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiSystemStateEntries.put(index, entry); 690c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 691c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 692c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 693c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne /** 694c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * Get the count of this system State Entry 695c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne */ 696c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne public int getSystemStateCount(int state, boolean screenOn) { 697c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne synchronized (mLock) { 698c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne int index = state * 2 + (screenOn ? SCREEN_ON : SCREEN_OFF); 699c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne return mWifiSystemStateEntries.get(index); 7001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 7011b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 7021b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 703ce003b812aead64dcb36647180991150021b24c1Glen Kuhne /** 7045f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * Increment number of times the Watchdog of Last Resort triggered, resetting the wifi stack 7055f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7065f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void incrementNumLastResortWatchdogTriggers() { 7075f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7085f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogTriggers++; 7095f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7105f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7115f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 7125f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * @param count number of networks over bad association threshold when watchdog triggered 7135f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7145f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void addCountToNumLastResortWatchdogBadAssociationNetworksTotal(int count) { 7155f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7165f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal += count; 7175f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7185f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7195f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 7205f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * @param count number of networks over bad authentication threshold when watchdog triggered 7215f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7225f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void addCountToNumLastResortWatchdogBadAuthenticationNetworksTotal(int count) { 7235f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7245f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal += count; 7255f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7265f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7275f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 7285f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * @param count number of networks over bad dhcp threshold when watchdog triggered 7295f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7305f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void addCountToNumLastResortWatchdogBadDhcpNetworksTotal(int count) { 7315f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7325f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal += count; 7335f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7345f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7355f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 7365f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * @param count number of networks over bad other threshold when watchdog triggered 7375f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7385f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void addCountToNumLastResortWatchdogBadOtherNetworksTotal(int count) { 7395f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7405f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal += count; 7415f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7425f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7435f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 7445f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * @param count number of networks seen when watchdog triggered 7455f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7465f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void addCountToNumLastResortWatchdogAvailableNetworksTotal(int count) { 7475f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7485f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal += count; 7495f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7505f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7515f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 7525f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * Increment count of triggers with atleast one bad association network 7535f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7545f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void incrementNumLastResortWatchdogTriggersWithBadAssociation() { 7555f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7565f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation++; 7575f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7585f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7595f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 7605f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * Increment count of triggers with atleast one bad authentication network 7615f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7625f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void incrementNumLastResortWatchdogTriggersWithBadAuthentication() { 7635f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7645f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication++; 7655f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7665f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7675f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 7685f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * Increment count of triggers with atleast one bad dhcp network 7695f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7705f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void incrementNumLastResortWatchdogTriggersWithBadDhcp() { 7715f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7725f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp++; 7735f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7745f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7755f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 7765f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne * Increment count of triggers with atleast one bad other network 7775f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne */ 7785f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne public void incrementNumLastResortWatchdogTriggersWithBadOther() { 7795f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne synchronized (mLock) { 7805f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne mWifiLogProto.numLastResortWatchdogTriggersWithBadOther++; 7815f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7825f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne } 7835f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne 7845f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne /** 785ce003b812aead64dcb36647180991150021b24c1Glen Kuhne * Increment number of times connectivity watchdog confirmed pno is working 786ce003b812aead64dcb36647180991150021b24c1Glen Kuhne */ 787ce003b812aead64dcb36647180991150021b24c1Glen Kuhne public void incrementNumConnectivityWatchdogPnoGood() { 788ce003b812aead64dcb36647180991150021b24c1Glen Kuhne synchronized (mLock) { 789ce003b812aead64dcb36647180991150021b24c1Glen Kuhne mWifiLogProto.numConnectivityWatchdogPnoGood++; 790ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 791ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 792ce003b812aead64dcb36647180991150021b24c1Glen Kuhne /** 793ce003b812aead64dcb36647180991150021b24c1Glen Kuhne * Increment number of times connectivity watchdog found pno not working 794ce003b812aead64dcb36647180991150021b24c1Glen Kuhne */ 795ce003b812aead64dcb36647180991150021b24c1Glen Kuhne public void incrementNumConnectivityWatchdogPnoBad() { 796ce003b812aead64dcb36647180991150021b24c1Glen Kuhne synchronized (mLock) { 797ce003b812aead64dcb36647180991150021b24c1Glen Kuhne mWifiLogProto.numConnectivityWatchdogPnoBad++; 798ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 799ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 800ce003b812aead64dcb36647180991150021b24c1Glen Kuhne /** 801ce003b812aead64dcb36647180991150021b24c1Glen Kuhne * Increment number of times connectivity watchdog confirmed background scan is working 802ce003b812aead64dcb36647180991150021b24c1Glen Kuhne */ 803ce003b812aead64dcb36647180991150021b24c1Glen Kuhne public void incrementNumConnectivityWatchdogBackgroundGood() { 804ce003b812aead64dcb36647180991150021b24c1Glen Kuhne synchronized (mLock) { 805ce003b812aead64dcb36647180991150021b24c1Glen Kuhne mWifiLogProto.numConnectivityWatchdogBackgroundGood++; 806ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 807ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 808ce003b812aead64dcb36647180991150021b24c1Glen Kuhne /** 809ce003b812aead64dcb36647180991150021b24c1Glen Kuhne * Increment number of times connectivity watchdog found background scan not working 810ce003b812aead64dcb36647180991150021b24c1Glen Kuhne */ 811ce003b812aead64dcb36647180991150021b24c1Glen Kuhne public void incrementNumConnectivityWatchdogBackgroundBad() { 812ce003b812aead64dcb36647180991150021b24c1Glen Kuhne synchronized (mLock) { 813ce003b812aead64dcb36647180991150021b24c1Glen Kuhne mWifiLogProto.numConnectivityWatchdogBackgroundBad++; 814ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 815ce003b812aead64dcb36647180991150021b24c1Glen Kuhne } 816ce003b812aead64dcb36647180991150021b24c1Glen Kuhne 8177a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne /** 81846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Increment various poll related metrics, and cache performance data for StaEvent logging 81946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 82046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public void handlePollResult(WifiInfo wifiInfo) { 82146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mLastPollRssi = wifiInfo.getRssi(); 82246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mLastPollLinkSpeed = wifiInfo.getLinkSpeed(); 82346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mLastPollFreq = wifiInfo.getFrequency(); 82446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne incrementRssiPollRssiCount(mLastPollRssi); 82546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 82646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 82746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 8287a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne * Increment occurence count of RSSI level from RSSI poll. 8297a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne * Ignores rssi values outside the bounds of [MIN_RSSI_POLL, MAX_RSSI_POLL] 8307a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne */ 8317a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne public void incrementRssiPollRssiCount(int rssi) { 8327a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne if (!(rssi >= MIN_RSSI_POLL && rssi <= MAX_RSSI_POLL)) { 8337a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne return; 8347a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne } 8357a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne synchronized (mLock) { 8367a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne int count = mRssiPollCounts.get(rssi); 8377a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne mRssiPollCounts.put(rssi, count + 1); 8385cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne maybeIncrementRssiDeltaCount(rssi - mScanResultRssi); 8395cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 8405cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 8415cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne 8425cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne /** 8435cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * Increment occurence count of difference between scan result RSSI and the first RSSI poll. 8445cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * Ignores rssi values outside the bounds of [MIN_RSSI_DELTA, MAX_RSSI_DELTA] 8455cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * mLock must be held when calling this method. 8465cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne */ 8475cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne private void maybeIncrementRssiDeltaCount(int rssi) { 8485cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne // Check if this RSSI poll is close enough to a scan result RSSI to log a delta value 8495cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne if (mScanResultRssiTimestampMillis >= 0) { 8505cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne long timeDelta = mClock.getElapsedSinceBootMillis() - mScanResultRssiTimestampMillis; 8515cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne if (timeDelta <= TIMEOUT_RSSI_DELTA_MILLIS) { 8525cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne if (rssi >= MIN_RSSI_DELTA && rssi <= MAX_RSSI_DELTA) { 8535cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne int count = mRssiDeltaCounts.get(rssi); 8545cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mRssiDeltaCounts.put(rssi, count + 1); 8555cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 8565cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 8575cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mScanResultRssiTimestampMillis = -1; 8587a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne } 8597a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne } 8607a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne 861da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne /** 8621c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne * Increment count of Watchdog successes. 8631c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne */ 8641c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne public void incrementNumLastResortWatchdogSuccesses() { 8651c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne synchronized (mLock) { 8661c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne mWifiLogProto.numLastResortWatchdogSuccesses++; 8671c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne } 8681c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne } 8691c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne 8701c50de232acb3d6148c454941a6b9a79e0663b81Glen Kuhne /** 871f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal * Increments the count of alerts by alert reason. 872f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal * 873f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal * @param reason The cause of the alert. The reason values are driver-specific. 874f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal */ 875f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal public void incrementAlertReasonCount(int reason) { 876f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal if (reason > WifiLoggerHal.WIFI_ALERT_REASON_MAX 877f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal || reason < WifiLoggerHal.WIFI_ALERT_REASON_MIN) { 878f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal reason = WifiLoggerHal.WIFI_ALERT_REASON_RESERVED; 879f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 880f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal synchronized (mLock) { 881f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal int alertCount = mWifiAlertReasonCounts.get(reason); 882f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal mWifiAlertReasonCounts.put(reason, alertCount + 1); 883f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 884f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 885f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal 886f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal /** 88759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne * Counts all the different types of networks seen in a set of scan results 88859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne */ 88959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne public void countScanResults(List<ScanDetail> scanDetails) { 89059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (scanDetails == null) { 89159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne return; 89259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 89359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne int totalResults = 0; 89459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne int openNetworks = 0; 89559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne int personalNetworks = 0; 89659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne int enterpriseNetworks = 0; 89759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne int hiddenNetworks = 0; 89859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne int hotspot2r1Networks = 0; 89959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne int hotspot2r2Networks = 0; 90059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne for (ScanDetail scanDetail : scanDetails) { 90159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne NetworkDetail networkDetail = scanDetail.getNetworkDetail(); 90259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne ScanResult scanResult = scanDetail.getScanResult(); 90359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne totalResults++; 90459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (networkDetail != null) { 90559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (networkDetail.isHiddenBeaconFrame()) { 90659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne hiddenNetworks++; 90759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 90859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (networkDetail.getHSRelease() != null) { 90959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R1) { 91059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne hotspot2r1Networks++; 91159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } else if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R2) { 91259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne hotspot2r2Networks++; 91359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 91459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 91559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 91659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (scanResult != null && scanResult.capabilities != null) { 91759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne if (ScanResultUtil.isScanResultForEapNetwork(scanResult)) { 91859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne enterpriseNetworks++; 91959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } else if (ScanResultUtil.isScanResultForPskNetwork(scanResult) 92059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne || ScanResultUtil.isScanResultForWepNetwork(scanResult)) { 92159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne personalNetworks++; 92259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } else { 92359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne openNetworks++; 92459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 92559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 92659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 92759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne synchronized (mLock) { 92859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numTotalScanResults += totalResults; 92959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numOpenNetworkScanResults += openNetworks; 93059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numPersonalNetworkScanResults += personalNetworks; 93159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numEnterpriseNetworkScanResults += enterpriseNetworks; 93259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numHiddenNetworkScanResults += hiddenNetworks; 93359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numHotspot2R1NetworkScanResults += hotspot2r1Networks; 93459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numHotspot2R2NetworkScanResults += hotspot2r2Networks; 93559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne mWifiLogProto.numScans++; 93659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 93759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne } 93859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne 93959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne /** 9404569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao * Increments occurence of a particular wifi score calculated 9414569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao * in WifiScoreReport by current connected network. Scores are bounded 9424569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao * within [MIN_WIFI_SCORE, MAX_WIFI_SCORE] to limit size of SparseArray 9434569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao */ 9444569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao public void incrementWifiScoreCount(int score) { 9454569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao if (score < MIN_WIFI_SCORE || score > MAX_WIFI_SCORE) { 9464569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao return; 9474569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao } 9484569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao synchronized (mLock) { 9494569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao int count = mWifiScoreCounts.get(score); 9504569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao mWifiScoreCounts.put(score, count + 1); 9514569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao } 9524569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao } 95359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne 95444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein /** 95544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein * Increments occurence of the results from attempting to start SoftAp. 95644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein * Maps the |result| and WifiManager |failureCode| constant to proto defined SoftApStartResult 95744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein * codes. 95844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein */ 95944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein public void incrementSoftApStartResult(boolean result, int failureCode) { 96044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein synchronized (mLock) { 96144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein if (result) { 96244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein int count = mSoftApManagerReturnCodeCounts.get( 96344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_STARTED_SUCCESSFULLY); 96444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mSoftApManagerReturnCodeCounts.put( 96544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_STARTED_SUCCESSFULLY, 96644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein count + 1); 96744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein return; 96844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein } 96944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein 97044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein // now increment failure modes - if not explicitly handled, dump into the general 97144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein // error bucket. 97244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein if (failureCode == WifiManager.SAP_START_FAILURE_NO_CHANNEL) { 97344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein int count = mSoftApManagerReturnCodeCounts.get( 97444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_NO_CHANNEL); 97544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mSoftApManagerReturnCodeCounts.put( 97644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_NO_CHANNEL, 97744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein count + 1); 97844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein } else { 97944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein // failure mode not tracked at this time... count as a general error for now. 98044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein int count = mSoftApManagerReturnCodeCounts.get( 98144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_GENERAL_ERROR); 98244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mSoftApManagerReturnCodeCounts.put( 98344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_GENERAL_ERROR, 98444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein count + 1); 98544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein } 98644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein } 98744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein } 98844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein 989bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius /** 990bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius * Increment number of times the HAL crashed. 991bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius */ 992bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius public void incrementNumHalCrashes() { 993bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius synchronized (mLock) { 994bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius mWifiLogProto.numHalCrashes++; 995bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius } 996bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius } 997bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius 998bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius /** 999bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius * Increment number of times the Wificond crashed. 1000bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius */ 1001bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius public void incrementNumWificondCrashes() { 1002bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius synchronized (mLock) { 1003bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius mWifiLogProto.numWificondCrashes++; 1004bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius } 1005bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius } 1006bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius 1007bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius /** 1008bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius * Increment number of times the wifi on failed due to an error in HAL. 1009bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius */ 1010bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius public void incrementNumWifiOnFailureDueToHal() { 1011bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius synchronized (mLock) { 1012bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius mWifiLogProto.numWifiOnFailureDueToHal++; 1013bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius } 1014bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius } 1015bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius 1016bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius /** 1017bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius * Increment number of times the wifi on failed due to an error in wificond. 1018bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius */ 1019bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius public void incrementNumWifiOnFailureDueToWificond() { 1020bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius synchronized (mLock) { 1021bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius mWifiLogProto.numWifiOnFailureDueToWificond++; 1022bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius } 1023bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius } 1024bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius 1025bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius 102611638f348ba45f9f417928e79b81186cef76c561Glen Kuhne public static final String PROTO_DUMP_ARG = "wifiMetricsProto"; 10279ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne public static final String CLEAN_DUMP_ARG = "clean"; 10289ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne 10291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 10301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * Dump all WifiMetrics. Collects some metrics from ConfigStore, Settings and WifiManager 10319ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne * at this time. 10321b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 10331b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param fd unused 10341b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param pw PrintWriter for writing dump to 10351b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param args unused 10361b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 10371b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 10381b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 1039031cdffdaf223772d4ea52569ec7a08d00013208Glen Kuhne if (args != null && args.length > 0 && PROTO_DUMP_ARG.equals(args[0])) { 10409ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne // Dump serialized WifiLog proto 10411b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne consolidateProto(true); 10421b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne for (ConnectionEvent event : mConnectionEventList) { 10431b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne if (mCurrentConnectionEvent != event) { 10441b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne //indicate that automatic bug report has been taken for all valid 10451b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne //connection events 10461b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne event.mConnectionEvent.automaticBugReportTaken = true; 10471b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 10481b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 10491b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne byte[] wifiMetricsProto = WifiMetricsProto.WifiLog.toByteArray(mWifiLogProto); 10501b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne String metricsProtoDump = Base64.encodeToString(wifiMetricsProto, Base64.DEFAULT); 10519ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne if (args.length > 1 && CLEAN_DUMP_ARG.equals(args[1])) { 10529ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne // Output metrics proto bytes (base64) and nothing else 10539ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne pw.print(metricsProtoDump); 10549ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne } else { 10559ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne // Tag the start and end of the metrics proto bytes 10569ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne pw.println("WifiMetrics:"); 10579ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne pw.println(metricsProtoDump); 10589ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne pw.println("EndWifiMetrics"); 10599ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne } 10602532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne clear(); 10611b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } else { 10629ff7dea01b09f658492b7b8fa122695e56d28cdcGlen Kuhne pw.println("WifiMetrics:"); 10631b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mConnectionEvents:"); 10641b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne for (ConnectionEvent event : mConnectionEventList) { 10651b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne String eventLine = event.toString(); 10661b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne if (event == mCurrentConnectionEvent) { 10671b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne eventLine += "CURRENTLY OPEN EVENT"; 10681b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 10691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println(eventLine); 10701b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 10711b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mWifiLogProto.numSavedNetworks=" + mWifiLogProto.numSavedNetworks); 10721b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mWifiLogProto.numOpenNetworks=" + mWifiLogProto.numOpenNetworks); 10731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mWifiLogProto.numPersonalNetworks=" 10741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne + mWifiLogProto.numPersonalNetworks); 10751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mWifiLogProto.numEnterpriseNetworks=" 10761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne + mWifiLogProto.numEnterpriseNetworks); 107759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numHiddenNetworks=" + mWifiLogProto.numHiddenNetworks); 107859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numPasspointNetworks=" 107959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numPasspointNetworks); 10801b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mWifiLogProto.isLocationEnabled=" + mWifiLogProto.isLocationEnabled); 10811b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne pw.println("mWifiLogProto.isScanningAlwaysEnabled=" 10821b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne + mWifiLogProto.isScanningAlwaysEnabled); 1083c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mWifiLogProto.numNetworksAddedByUser=" 1084c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + mWifiLogProto.numNetworksAddedByUser); 1085c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mWifiLogProto.numNetworksAddedByApps=" 1086c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + mWifiLogProto.numNetworksAddedByApps); 1087c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mWifiLogProto.numNonEmptyScanResults=" 1088c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + mWifiLogProto.numNonEmptyScanResults); 1089c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mWifiLogProto.numEmptyScanResults=" 1090c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + mWifiLogProto.numEmptyScanResults); 1091c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mWifiLogProto.numOneshotScans=" 1092c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + mWifiLogProto.numOneshotScans); 1093c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mWifiLogProto.numBackgroundScans=" 1094c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + mWifiLogProto.numBackgroundScans); 1095c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 1096c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mScanReturnEntries:"); 1097c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" SCAN_UNKNOWN: " + getScanReturnEntry( 1098c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne WifiMetricsProto.WifiLog.SCAN_UNKNOWN)); 1099c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" SCAN_SUCCESS: " + getScanReturnEntry( 1100c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne WifiMetricsProto.WifiLog.SCAN_SUCCESS)); 1101c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" SCAN_FAILURE_INTERRUPTED: " + getScanReturnEntry( 1102c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne WifiMetricsProto.WifiLog.SCAN_FAILURE_INTERRUPTED)); 1103c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" SCAN_FAILURE_INVALID_CONFIGURATION: " + getScanReturnEntry( 1104c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne WifiMetricsProto.WifiLog.SCAN_FAILURE_INVALID_CONFIGURATION)); 1105c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" FAILURE_WIFI_DISABLED: " + getScanReturnEntry( 1106c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne WifiMetricsProto.WifiLog.FAILURE_WIFI_DISABLED)); 1107c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 1108c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println("mSystemStateEntries: <state><screenOn> : <scansInitiated>"); 1109c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_UNKNOWN ON: " 1110c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_UNKNOWN, true)); 1111c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_DISABLED ON: " 1112c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISABLED, true)); 1113c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_DISCONNECTED ON: " 1114c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISCONNECTED, true)); 1115c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_ASSOCIATED ON: " 1116c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_ASSOCIATED, true)); 1117c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_UNKNOWN OFF: " 1118c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_UNKNOWN, false)); 1119c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_DISABLED OFF: " 1120c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISABLED, false)); 1121c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_DISCONNECTED OFF: " 1122c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_DISCONNECTED, false)); 1123c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne pw.println(" WIFI_ASSOCIATED OFF: " 1124c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne + getSystemStateCount(WifiMetricsProto.WifiLog.WIFI_ASSOCIATED, false)); 1125ce003b812aead64dcb36647180991150021b24c1Glen Kuhne pw.println("mWifiLogProto.numConnectivityWatchdogPnoGood=" 1126ce003b812aead64dcb36647180991150021b24c1Glen Kuhne + mWifiLogProto.numConnectivityWatchdogPnoGood); 1127ce003b812aead64dcb36647180991150021b24c1Glen Kuhne pw.println("mWifiLogProto.numConnectivityWatchdogPnoBad=" 1128ce003b812aead64dcb36647180991150021b24c1Glen Kuhne + mWifiLogProto.numConnectivityWatchdogPnoBad); 1129ce003b812aead64dcb36647180991150021b24c1Glen Kuhne pw.println("mWifiLogProto.numConnectivityWatchdogBackgroundGood=" 1130ce003b812aead64dcb36647180991150021b24c1Glen Kuhne + mWifiLogProto.numConnectivityWatchdogBackgroundGood); 1131ce003b812aead64dcb36647180991150021b24c1Glen Kuhne pw.println("mWifiLogProto.numConnectivityWatchdogBackgroundBad=" 1132ce003b812aead64dcb36647180991150021b24c1Glen Kuhne + mWifiLogProto.numConnectivityWatchdogBackgroundBad); 11335f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogTriggers=" 11345f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogTriggers); 11355f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal=" 11365f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogBadAssociationNetworksTotal); 11375f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal=" 11385f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogBadAuthenticationNetworksTotal); 11395f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal=" 11405f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogBadDhcpNetworksTotal); 11415f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal=" 11425f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogBadOtherNetworksTotal); 11435f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal=" 11445f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogAvailableNetworksTotal); 11455f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation=" 11465f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogTriggersWithBadAssociation); 11475f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication=" 11485f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogTriggersWithBadAuthentication); 11495f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp=" 11505f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogTriggersWithBadDhcp); 11515f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogTriggersWithBadOther=" 11525f001750a0ce82a8b3a47ac566117d4de27f3e23Glen Kuhne + mWifiLogProto.numLastResortWatchdogTriggersWithBadOther); 1153da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne pw.println("mWifiLogProto.numLastResortWatchdogSuccesses=" 1154da22e3d28b62005dce5fddd75207bd3d7a1745e1Glen Kuhne + mWifiLogProto.numLastResortWatchdogSuccesses); 1155107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne pw.println("mWifiLogProto.recordDurationSec=" 1156107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne + ((mClock.getElapsedSinceBootMillis() / 1000) - mRecordStartTimeSec)); 11577a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne pw.println("mWifiLogProto.rssiPollRssiCount: Printing counts for [" + MIN_RSSI_POLL 11587a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne + ", " + MAX_RSSI_POLL + "]"); 11597a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne StringBuilder sb = new StringBuilder(); 11607a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne for (int i = MIN_RSSI_POLL; i <= MAX_RSSI_POLL; i++) { 11617a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne sb.append(mRssiPollCounts.get(i) + " "); 11627a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne } 11637a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne pw.println(" " + sb.toString()); 11645cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne pw.println("mWifiLogProto.rssiPollDeltaCount: Printing counts for [" 11655cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne + MIN_RSSI_DELTA + ", " + MAX_RSSI_DELTA + "]"); 11665cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne sb.setLength(0); 11675cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne for (int i = MIN_RSSI_DELTA; i <= MAX_RSSI_DELTA; i++) { 11685cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne sb.append(mRssiDeltaCounts.get(i) + " "); 11695cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 11705cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne pw.println(" " + sb.toString()); 1171f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal pw.print("mWifiLogProto.alertReasonCounts="); 1172f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal sb.setLength(0); 1173f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal for (int i = WifiLoggerHal.WIFI_ALERT_REASON_MIN; 1174f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal i <= WifiLoggerHal.WIFI_ALERT_REASON_MAX; i++) { 1175f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal int count = mWifiAlertReasonCounts.get(i); 1176f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal if (count > 0) { 1177f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal sb.append("(" + i + "," + count + "),"); 1178f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 1179f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 1180f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal if (sb.length() > 1) { 1181f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal sb.setLength(sb.length() - 1); // strip trailing comma 1182f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal pw.println(sb.toString()); 1183f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } else { 1184f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal pw.println("()"); 1185f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 118659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numTotalScanResults=" 118759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numTotalScanResults); 118859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numOpenNetworkScanResults=" 118959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numOpenNetworkScanResults); 119059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numPersonalNetworkScanResults=" 119159f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numPersonalNetworkScanResults); 119259f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numEnterpriseNetworkScanResults=" 119359f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numEnterpriseNetworkScanResults); 119459f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numHiddenNetworkScanResults=" 119559f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numHiddenNetworkScanResults); 119659f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numHotspot2R1NetworkScanResults=" 119759f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numHotspot2R1NetworkScanResults); 119859f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numHotspot2R2NetworkScanResults=" 119959f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne + mWifiLogProto.numHotspot2R2NetworkScanResults); 120059f9a74676831ba4634b35d56a1e2bbe9bf4e322Glen Kuhne pw.println("mWifiLogProto.numScans=" + mWifiLogProto.numScans); 12014569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao pw.println("mWifiLogProto.WifiScoreCount: [" + MIN_WIFI_SCORE + ", " 12024569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao + MAX_WIFI_SCORE + "]"); 12034569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao for (int i = 0; i <= MAX_WIFI_SCORE; i++) { 12044569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao pw.print(mWifiScoreCounts.get(i) + " "); 12054569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao } 120644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein pw.println(); // add a line after wifi scores 120744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein pw.println("mWifiLogProto.SoftApManagerReturnCodeCounts:"); 120844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein pw.println(" SUCCESS: " + mSoftApManagerReturnCodeCounts.get( 120944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_STARTED_SUCCESSFULLY)); 121044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein pw.println(" FAILED_GENERAL_ERROR: " + mSoftApManagerReturnCodeCounts.get( 121144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_GENERAL_ERROR)); 121244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein pw.println(" FAILED_NO_CHANNEL: " + mSoftApManagerReturnCodeCounts.get( 121344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein WifiMetricsProto.SoftApReturnCodeCount.SOFT_AP_FAILED_NO_CHANNEL)); 12144569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao pw.print("\n"); 1215bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius pw.println("mWifiLogProto.numHalCrashes=" 1216bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius + mWifiLogProto.numHalCrashes); 1217bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius pw.println("mWifiLogProto.numWificondCrashes=" 1218bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius + mWifiLogProto.numWificondCrashes); 1219bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius pw.println("mWifiLogProto.numWifiOnFailureDueToHal=" 1220bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius + mWifiLogProto.numWifiOnFailureDueToHal); 1221bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius pw.println("mWifiLogProto.numWifiOnFailureDueToWificond=" 1222bd2cff58fca2f3d9a0cd6df8526b23f48d9d44ecRoshan Pius + mWifiLogProto.numWifiOnFailureDueToWificond); 122346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne pw.println("StaEventList:"); 122446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne for (StaEvent event : mStaEventList) { 122546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne pw.println(staEventToString(event)); 122646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 12271b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 12281b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 12291b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 12301b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne 12313c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne 12323c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne /** 12333c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne * Update various counts of saved network types 12343c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne * @param networks List of WifiConfigurations representing all saved networks, must not be null 12353c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne */ 12363c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne public void updateSavedNetworks(List<WifiConfiguration> networks) { 12373c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne synchronized (mLock) { 12383c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numSavedNetworks = networks.size(); 12393c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numOpenNetworks = 0; 12403c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numPersonalNetworks = 0; 12413c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numEnterpriseNetworks = 0; 12423c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numNetworksAddedByUser = 0; 12433c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numNetworksAddedByApps = 0; 12443c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numHiddenNetworks = 0; 12453c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numPasspointNetworks = 0; 12463c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne for (WifiConfiguration config : networks) { 12473c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne if (config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.NONE)) { 12483c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numOpenNetworks++; 12493c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } else if (config.isEnterprise()) { 12503c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numEnterpriseNetworks++; 12513c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } else { 12523c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numPersonalNetworks++; 12533c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } 12543c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne if (config.selfAdded) { 12553c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numNetworksAddedByUser++; 12563c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } else { 12573c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numNetworksAddedByApps++; 12583c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } 12593c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne if (config.hiddenSSID) { 12603c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numHiddenNetworks++; 12613c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } 12623c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne if (config.isPasspoint()) { 12633c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne mWifiLogProto.numPasspointNetworks++; 12643c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } 12653c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } 12663c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } 12673c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne } 12683c6e92f51984ba8999d5efe622b4a52dd18bdaffGlen Kuhne 12691b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne /** 1270c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * append the separate ConnectionEvent, SystemStateEntry and ScanReturnCode collections to their 1271c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne * respective lists within mWifiLogProto 12721b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * 12731b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne * @param incremental Only include ConnectionEvents created since last automatic bug report 12741b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne */ 12751b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne private void consolidateProto(boolean incremental) { 12761b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne List<WifiMetricsProto.ConnectionEvent> events = new ArrayList<>(); 12777a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne List<WifiMetricsProto.RssiPollCount> rssis = new ArrayList<>(); 12785cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne List<WifiMetricsProto.RssiPollCount> rssiDeltas = new ArrayList<>(); 1279f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal List<WifiMetricsProto.AlertReasonCount> alertReasons = new ArrayList<>(); 12804569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao List<WifiMetricsProto.WifiScoreCount> scores = new ArrayList<>(); 12811b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne synchronized (mLock) { 12821b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne for (ConnectionEvent event : mConnectionEventList) { 1283c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne // If this is not incremental, dump full ConnectionEvent list 1284c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne // Else Dump all un-dumped events except for the current one 12851b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne if (!incremental || ((mCurrentConnectionEvent != event) 12861b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne && !event.mConnectionEvent.automaticBugReportTaken)) { 12871b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne //Get all ConnectionEvents that haven not been dumped as a proto, also exclude 12881b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne //the current active un-ended connection event 12891b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne events.add(event.mConnectionEvent); 1290c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne if (incremental) { 1291c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne event.mConnectionEvent.automaticBugReportTaken = true; 1292c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 12931b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 12941b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 12951b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne if (events.size() > 0) { 12961b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne mWifiLogProto.connectionEvent = events.toArray(mWifiLogProto.connectionEvent); 12971b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 1298c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 1299c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne //Convert the SparseIntArray of scanReturnEntry integers into ScanReturnEntry proto list 1300c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.scanReturnEntries = 1301c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne new WifiMetricsProto.WifiLog.ScanReturnEntry[mScanReturnEntries.size()]; 1302c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne for (int i = 0; i < mScanReturnEntries.size(); i++) { 1303c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.scanReturnEntries[i] = new WifiMetricsProto.WifiLog.ScanReturnEntry(); 1304c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.scanReturnEntries[i].scanReturnCode = mScanReturnEntries.keyAt(i); 1305c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.scanReturnEntries[i].scanResultsCount = mScanReturnEntries.valueAt(i); 1306c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 1307c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne 1308c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne // Convert the SparseIntArray of systemStateEntry into WifiSystemStateEntry proto list 1309c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne // This one is slightly more complex, as the Sparse are indexed with: 1310c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne // key: wifiState * 2 + isScreenOn, value: wifiStateCount 1311c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.wifiSystemStateEntries = 1312c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne new WifiMetricsProto.WifiLog 1313c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne .WifiSystemStateEntry[mWifiSystemStateEntries.size()]; 1314c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne for (int i = 0; i < mWifiSystemStateEntries.size(); i++) { 1315c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.wifiSystemStateEntries[i] = 1316c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne new WifiMetricsProto.WifiLog.WifiSystemStateEntry(); 1317c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.wifiSystemStateEntries[i].wifiState = 1318c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiSystemStateEntries.keyAt(i) / 2; 1319c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.wifiSystemStateEntries[i].wifiStateCount = 1320c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiSystemStateEntries.valueAt(i); 1321c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne mWifiLogProto.wifiSystemStateEntries[i].isScreenOn = 1322c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne (mWifiSystemStateEntries.keyAt(i) % 2) > 0; 1323c2c2648141e6190d85601ee8a6a1d0034e7ff927Glen Kuhne } 1324107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne mWifiLogProto.recordDurationSec = (int) ((mClock.getElapsedSinceBootMillis() / 1000) 1325107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne - mRecordStartTimeSec); 13267a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne 13277a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne /** 13287a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne * Convert the SparseIntArray of RSSI poll rssi's and counts to the proto's repeated 13297a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne * IntKeyVal array. 13307a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne */ 13317a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne for (int i = 0; i < mRssiPollCounts.size(); i++) { 13327a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne WifiMetricsProto.RssiPollCount keyVal = new WifiMetricsProto.RssiPollCount(); 13337a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne keyVal.rssi = mRssiPollCounts.keyAt(i); 13347a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne keyVal.count = mRssiPollCounts.valueAt(i); 13357a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne rssis.add(keyVal); 13367a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne } 13377a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne mWifiLogProto.rssiPollRssiCount = rssis.toArray(mWifiLogProto.rssiPollRssiCount); 1338f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal 1339f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal /** 13405cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * Convert the SparseIntArray of RSSI delta rssi's and counts to the proto's repeated 13415cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne * IntKeyVal array. 13425cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne */ 13435cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne for (int i = 0; i < mRssiDeltaCounts.size(); i++) { 13445cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne WifiMetricsProto.RssiPollCount keyVal = new WifiMetricsProto.RssiPollCount(); 13455cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne keyVal.rssi = mRssiDeltaCounts.keyAt(i); 13465cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne keyVal.count = mRssiDeltaCounts.valueAt(i); 13475cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne rssiDeltas.add(keyVal); 13485cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne } 13495cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mWifiLogProto.rssiPollDeltaCount = rssiDeltas.toArray(mWifiLogProto.rssiPollDeltaCount); 13505cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne 13515cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne /** 1352f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal * Convert the SparseIntArray of alert reasons and counts to the proto's repeated 1353f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal * IntKeyVal array. 1354f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal */ 1355f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal for (int i = 0; i < mWifiAlertReasonCounts.size(); i++) { 1356f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal WifiMetricsProto.AlertReasonCount keyVal = new WifiMetricsProto.AlertReasonCount(); 1357f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal keyVal.reason = mWifiAlertReasonCounts.keyAt(i); 1358f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal keyVal.count = mWifiAlertReasonCounts.valueAt(i); 1359f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal alertReasons.add(keyVal); 1360f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal } 1361f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal mWifiLogProto.alertReasonCount = alertReasons.toArray(mWifiLogProto.alertReasonCount); 13624569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao 13634569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao /** 13644569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao * Convert the SparseIntArray of Wifi Score and counts to proto's repeated 13654569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao * IntKeyVal array. 13664569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao */ 13674569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao for (int score = 0; score < mWifiScoreCounts.size(); score++) { 13684569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao WifiMetricsProto.WifiScoreCount keyVal = new WifiMetricsProto.WifiScoreCount(); 13694569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao keyVal.score = mWifiScoreCounts.keyAt(score); 13704569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao keyVal.count = mWifiScoreCounts.valueAt(score); 13714569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao scores.add(keyVal); 13724569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao } 13734569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao mWifiLogProto.wifiScoreCount = scores.toArray(mWifiLogProto.wifiScoreCount); 137444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein 137544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein /** 137644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein * Convert the SparseIntArray of SoftAp Return codes and counts to proto's repeated 137744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein * IntKeyVal array. 137844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein */ 137944ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein int codeCounts = mSoftApManagerReturnCodeCounts.size(); 138044ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mWifiLogProto.softApReturnCode = new WifiMetricsProto.SoftApReturnCodeCount[codeCounts]; 138144ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein for (int sapCode = 0; sapCode < codeCounts; sapCode++) { 138244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mWifiLogProto.softApReturnCode[sapCode] = 138344ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein new WifiMetricsProto.SoftApReturnCodeCount(); 138444ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mWifiLogProto.softApReturnCode[sapCode].startResult = 138544ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mSoftApManagerReturnCodeCounts.keyAt(sapCode); 138644ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mWifiLogProto.softApReturnCode[sapCode].count = 138744ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mSoftApManagerReturnCodeCounts.valueAt(sapCode); 138844ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein } 138946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 139046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mWifiLogProto.staEventList = mStaEventList.toArray(mWifiLogProto.staEventList); 1391ebd663ff7027bbf19c4a5ed2bfb71b91bb925cd6Glen Kuhne } 13921b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne } 13932532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne 13942532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne /** 13952532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne * Clear all WifiMetrics, except for currentConnectionEvent. 13962532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne */ 13972532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne private void clear() { 13982532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne synchronized (mLock) { 13992532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mConnectionEventList.clear(); 14002532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne if (mCurrentConnectionEvent != null) { 14012532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mConnectionEventList.add(mCurrentConnectionEvent); 14022532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 14032532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mScanReturnEntries.clear(); 14042532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mWifiSystemStateEntries.clear(); 1405107f6ce4a5f6017ce336d9b60650ddbe28bee965Glen Kuhne mRecordStartTimeSec = mClock.getElapsedSinceBootMillis() / 1000; 14067a0b9ffe794113c4a5ed528d8aadeb3303d1b089Glen Kuhne mRssiPollCounts.clear(); 14075cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mRssiDeltaCounts.clear(); 1408f11073c03746f1c79e6a316884bc59574b562a8bmukesh agrawal mWifiAlertReasonCounts.clear(); 14094569ebc2277f35b9bd1baa98194f963388e0c4caSohani Rao mWifiScoreCounts.clear(); 14102532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne mWifiLogProto.clear(); 14115cab82f2e70c360de79e6ca50da25c7657ed345dGlen Kuhne mScanResultRssiTimestampMillis = -1; 141244ce135519e22d8c4746abac21c14111f1ce8667Rebecca Silberstein mSoftApManagerReturnCodeCounts.clear(); 141346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mStaEventList.clear(); 14142532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 14152532a24b254d724a9b6771d327dc410b32b18602Glen Kuhne } 1416ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne 1417ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne /** 1418ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne * Set screen state (On/Off) 1419ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne */ 1420ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne public void setScreenState(boolean screenOn) { 1421ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne synchronized (mLock) { 1422ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mScreenOn = screenOn; 1423ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne } 1424ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne } 1425ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne 1426ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne /** 1427ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne * Set wifi state (WIFI_UNKNOWN, WIFI_DISABLED, WIFI_DISCONNECTED, WIFI_ASSOCIATED) 1428ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne */ 1429ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne public void setWifiState(int wifiState) { 1430ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne synchronized (mLock) { 1431ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne mWifiState = wifiState; 1432ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne } 1433ea6fdf9a58f8ee83fba32c221331f10f9ec941e9Glen Kuhne } 143446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 143546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 143646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Message handler for interesting WifiMonitor messages. Generates StaEvents 143746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 143846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private void processMessage(Message msg) { 143946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne StaEvent event = new StaEvent(); 144046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne boolean logEvent = true; 144146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne switch (msg.what) { 144246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiMonitor.ASSOCIATION_REJECTION_EVENT: 144346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.type = StaEvent.TYPE_ASSOCIATION_REJECTION_EVENT; 144446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.associationTimedOut = msg.arg1 > 0 ? true : false; 144546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.status = msg.arg2; 144646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 144746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiMonitor.AUTHENTICATION_FAILURE_EVENT: 144846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.type = StaEvent.TYPE_AUTHENTICATION_FAILURE_EVENT; 144946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne switch (msg.arg2) { 145046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiManager.ERROR_AUTH_FAILURE_NONE: 145146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.authFailureReason = StaEvent.AUTH_FAILURE_NONE; 145246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 145346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiManager.ERROR_AUTH_FAILURE_TIMEOUT: 145446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.authFailureReason = StaEvent.AUTH_FAILURE_TIMEOUT; 145546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 145646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiManager.ERROR_AUTH_FAILURE_WRONG_PSWD: 145746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.authFailureReason = StaEvent.AUTH_FAILURE_WRONG_PSWD; 145846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 145946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiManager.ERROR_AUTH_FAILURE_EAP_FAILURE: 146046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.authFailureReason = StaEvent.AUTH_FAILURE_EAP_FAILURE; 146146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 146246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne default: 146346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 146446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 146546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 146646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiMonitor.NETWORK_CONNECTION_EVENT: 146746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.type = StaEvent.TYPE_NETWORK_CONNECTION_EVENT; 146846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 146946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiMonitor.NETWORK_DISCONNECTION_EVENT: 147046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.type = StaEvent.TYPE_NETWORK_DISCONNECTION_EVENT; 147146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.reason = msg.arg2; 147246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.localGen = msg.arg1 == 0 ? false : true; 147346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 147446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT: 147546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne logEvent = false; 147646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne StateChangeResult stateChangeResult = (StateChangeResult) msg.obj; 147746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mSupplicantStateChangeBitmask |= supplicantStateToBit(stateChangeResult.state); 147846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 147946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiStateMachine.CMD_ASSOCIATED_BSSID: 148046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.type = StaEvent.TYPE_CMD_ASSOCIATED_BSSID; 148146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 148246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case WifiStateMachine.CMD_TARGET_BSSID: 148346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.type = StaEvent.TYPE_CMD_TARGET_BSSID; 148446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 148546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne default: 148646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return; 148746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 148846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (logEvent) { 148946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne addStaEvent(event); 149046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 149146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 149246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 149346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Log a StaEvent from WifiStateMachine. The StaEvent must not be one of the supplicant 149446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * generated event types, which are logged through 'sendMessage' 149546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * @param type StaEvent.EventType describing the event 149646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 149746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public void logStaEvent(int type) { 149846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne logStaEvent(type, StaEvent.DISCONNECT_UNKNOWN, null); 149946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 150046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 150146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Log a StaEvent from WifiStateMachine. The StaEvent must not be one of the supplicant 150246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * generated event types, which are logged through 'sendMessage' 150346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * @param type StaEvent.EventType describing the event 150446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * @param config WifiConfiguration for a framework initiated connection attempt 150546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 150646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public void logStaEvent(int type, WifiConfiguration config) { 150746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne logStaEvent(type, StaEvent.DISCONNECT_UNKNOWN, config); 150846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 150946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 151046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Log a StaEvent from WifiStateMachine. The StaEvent must not be one of the supplicant 151146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * generated event types, which are logged through 'sendMessage' 151246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * @param type StaEvent.EventType describing the event 151346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * @param frameworkDisconnectReason StaEvent.FrameworkDisconnectReason explaining why framework 151446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * initiated a FRAMEWORK_DISCONNECT 151546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 151646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public void logStaEvent(int type, int frameworkDisconnectReason) { 151746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne logStaEvent(type, frameworkDisconnectReason, null); 151846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 151946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 152046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Log a StaEvent from WifiStateMachine. The StaEvent must not be one of the supplicant 152146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * generated event types, which are logged through 'sendMessage' 152246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * @param type StaEvent.EventType describing the event 152346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * @param frameworkDisconnectReason StaEvent.FrameworkDisconnectReason explaining why framework 152446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * initiated a FRAMEWORK_DISCONNECT 152546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * @param config WifiConfiguration for a framework initiated connection attempt 152646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 152746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public void logStaEvent(int type, int frameworkDisconnectReason, WifiConfiguration config) { 152846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne switch (type) { 152946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_IP_CONFIGURATION_SUCCESSFUL: 153046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_IP_CONFIGURATION_LOST: 153146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_IP_REACHABILITY_LOST: 153246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_START_CONNECT: 153346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_START_ROAM: 153446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CONNECT_NETWORK: 153546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_NETWORK_AGENT_VALID_NETWORK: 153646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_FRAMEWORK_DISCONNECT: 153746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 153846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne default: 153946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne Log.e(TAG, "Unknown StaEvent:" + type); 154046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return; 154146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 154246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne StaEvent event = new StaEvent(); 154346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.type = type; 154446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (frameworkDisconnectReason != StaEvent.DISCONNECT_UNKNOWN) { 154546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.frameworkDisconnectReason = frameworkDisconnectReason; 154646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 154746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.configInfo = createConfigInfo(config); 154846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne addStaEvent(event); 154946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 155046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 155146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private void addStaEvent(StaEvent staEvent) { 155246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne staEvent.startTimeMillis = mClock.getElapsedSinceBootMillis(); 155346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne staEvent.lastRssi = mLastPollRssi; 155446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne staEvent.lastFreq = mLastPollFreq; 155546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne staEvent.lastLinkSpeed = mLastPollLinkSpeed; 155646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne staEvent.supplicantStateChangesBitmask = mSupplicantStateChangeBitmask; 155746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mSupplicantStateChangeBitmask = 0; 155846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mLastPollRssi = -127; 155946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mLastPollFreq = -1; 156046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mLastPollLinkSpeed = -1; 156146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne mStaEventList.add(staEvent); 156246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne // Prune StaEventList if it gets too long 156346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (mStaEventList.size() > MAX_STA_EVENTS) mStaEventList.remove(); 156446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 156546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 156646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private ConfigInfo createConfigInfo(WifiConfiguration config) { 156746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (config == null) return null; 156846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne ConfigInfo info = new ConfigInfo(); 156946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.allowedKeyManagement = bitSetToInt(config.allowedKeyManagement); 157046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.allowedProtocols = bitSetToInt(config.allowedProtocols); 157146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.allowedAuthAlgorithms = bitSetToInt(config.allowedAuthAlgorithms); 157246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.allowedPairwiseCiphers = bitSetToInt(config.allowedPairwiseCiphers); 157346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.allowedGroupCiphers = bitSetToInt(config.allowedGroupCiphers); 157446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.hiddenSsid = config.hiddenSSID; 157546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.isPasspoint = config.isPasspoint(); 157646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.isEphemeral = config.isEphemeral(); 157746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.hasEverConnected = config.getNetworkSelectionStatus().getHasEverConnected(); 157846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne ScanResult candidate = config.getNetworkSelectionStatus().getCandidate(); 157946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (candidate != null) { 158046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.scanRssi = candidate.level; 158146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne info.scanFreq = candidate.frequency; 158246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 158346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return info; 158446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 158546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 158646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public Handler getHandler() { 158746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return mHandler; 158846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 158946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 159046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne // Rather than generate a StaEvent for each SUPPLICANT_STATE_CHANGE, cache these in a bitmask 159146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne // and attach it to the next event which is generated. 159246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private int mSupplicantStateChangeBitmask = 0; 159346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 159446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 159546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Converts a SupplicantState value to a single bit, with position defined by 159646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * {@code StaEvent.SupplicantState} 159746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 159846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public static int supplicantStateToBit(SupplicantState state) { 159946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne switch(state) { 160046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case DISCONNECTED: 160146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_DISCONNECTED; 160246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case INTERFACE_DISABLED: 160346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_INTERFACE_DISABLED; 160446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case INACTIVE: 160546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_INACTIVE; 160646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case SCANNING: 160746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_SCANNING; 160846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case AUTHENTICATING: 160946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_AUTHENTICATING; 161046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case ASSOCIATING: 161146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_ASSOCIATING; 161246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case ASSOCIATED: 161346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_ASSOCIATED; 161446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case FOUR_WAY_HANDSHAKE: 161546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_FOUR_WAY_HANDSHAKE; 161646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case GROUP_HANDSHAKE: 161746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_GROUP_HANDSHAKE; 161846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case COMPLETED: 161946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_COMPLETED; 162046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case DORMANT: 162146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_DORMANT; 162246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case UNINITIALIZED: 162346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_UNINITIALIZED; 162446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case INVALID: 162546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 1 << StaEvent.STATE_INVALID; 162646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne default: 162746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne Log.wtf(TAG, "Got unknown supplicant state: " + state.ordinal()); 162846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return 0; 162946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 163046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 163146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 163246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static String supplicantStateChangesBitmaskToString(int mask) { 163346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne StringBuilder sb = new StringBuilder(); 163446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne sb.append("SUPPLICANT_STATE_CHANGE_EVENTS: {"); 163546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_DISCONNECTED)) > 0) sb.append(" DISCONNECTED"); 163646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_INTERFACE_DISABLED)) > 0) sb.append(" INTERFACE_DISABLED"); 163746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_INACTIVE)) > 0) sb.append(" INACTIVE"); 163846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_SCANNING)) > 0) sb.append(" SCANNING"); 163946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_AUTHENTICATING)) > 0) sb.append(" AUTHENTICATING"); 164046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_ASSOCIATING)) > 0) sb.append(" ASSOCIATING"); 164146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_ASSOCIATED)) > 0) sb.append(" ASSOCIATED"); 164246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_FOUR_WAY_HANDSHAKE)) > 0) sb.append(" FOUR_WAY_HANDSHAKE"); 164346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_GROUP_HANDSHAKE)) > 0) sb.append(" GROUP_HANDSHAKE"); 164446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_COMPLETED)) > 0) sb.append(" COMPLETED"); 164546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_DORMANT)) > 0) sb.append(" DORMANT"); 164646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_UNINITIALIZED)) > 0) sb.append(" UNINITIALIZED"); 164746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if ((mask & (1 << StaEvent.STATE_INVALID)) > 0) sb.append(" INVALID"); 164846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne sb.append("}"); 164946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return sb.toString(); 165046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 165146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 165246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 165346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Returns a human readable string from a Sta Event. Only adds information relevant to the event 165446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * type. 165546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 165646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public static String staEventToString(StaEvent event) { 165746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (event == null) return "<NULL>"; 165846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne StringBuilder sb = new StringBuilder(); 165946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne Long time = event.startTimeMillis; 166046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne sb.append(String.format("%9d ", time.longValue())).append(" "); 166146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne switch (event.type) { 166246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_ASSOCIATION_REJECTION_EVENT: 166346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne sb.append("ASSOCIATION_REJECTION_EVENT:") 166446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" timedOut=").append(event.associationTimedOut) 166546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" status=").append(event.status).append(":") 166646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(ISupplicantStaIfaceCallback.StatusCode.toString(event.status)); 166746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 166846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_AUTHENTICATION_FAILURE_EVENT: 166946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne sb.append("AUTHENTICATION_FAILURE_EVENT: reason=").append(event.authFailureReason) 167046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(":").append(authFailureReasonToString(event.authFailureReason)); 167146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 167246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_NETWORK_CONNECTION_EVENT: 167346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne sb.append("NETWORK_CONNECTION_EVENT:"); 167446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 167546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_NETWORK_DISCONNECTION_EVENT: 167646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne sb.append("NETWORK_DISCONNECTION_EVENT:") 167746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" local_gen=").append(event.localGen) 167846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" reason=").append(event.reason).append(":") 167946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(ISupplicantStaIfaceCallback.ReasonCode.toString( 168046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne (event.reason >= 0 ? event.reason : -1 * event.reason))); 168146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 168246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_ASSOCIATED_BSSID: 168346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne sb.append("CMD_ASSOCIATED_BSSID:"); 168446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 168546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_IP_CONFIGURATION_SUCCESSFUL: 168646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne sb.append("CMD_IP_CONFIGURATION_SUCCESSFUL:"); 168746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 168846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_IP_CONFIGURATION_LOST: 168946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne sb.append("CMD_IP_CONFIGURATION_LOST:"); 169046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 169146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_IP_REACHABILITY_LOST: 169246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne sb.append("CMD_IP_REACHABILITY_LOST:"); 169346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 169446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_TARGET_BSSID: 169546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne sb.append("CMD_TARGET_BSSID:"); 169646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 169746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_START_CONNECT: 169846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne sb.append("CMD_START_CONNECT:"); 169946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 170046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CMD_START_ROAM: 170146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne sb.append("CMD_START_ROAM:"); 170246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 170346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_CONNECT_NETWORK: 170446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne sb.append("CONNECT_NETWORK:"); 170546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 170646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_NETWORK_AGENT_VALID_NETWORK: 170746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne sb.append("NETWORK_AGENT_VALID_NETWORK:"); 170846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 170946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.TYPE_FRAMEWORK_DISCONNECT: 171046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne sb.append("FRAMEWORK_DISCONNECT:") 171146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" reason=") 171246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(frameworkDisconnectReasonToString(event.frameworkDisconnectReason)); 171346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 171446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne default: 171546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne sb.append("UNKNOWN " + event.type + ":"); 171646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne break; 171746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 171846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (event.lastRssi != -127) sb.append(" lastRssi=").append(event.lastRssi); 171946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (event.lastFreq != -1) sb.append(" lastFreq=").append(event.lastFreq); 172046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (event.lastLinkSpeed != -1) sb.append(" lastLinkSpeed=").append(event.lastLinkSpeed); 172146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (event.supplicantStateChangesBitmask != 0) { 172246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne sb.append("\n ").append(supplicantStateChangesBitmaskToString( 172346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne event.supplicantStateChangesBitmask)); 172446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 172546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne if (event.configInfo != null) { 172646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne sb.append("\n ").append(configInfoToString(event.configInfo)); 172746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 172846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 172946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return sb.toString(); 173046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 173146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 173246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static String authFailureReasonToString(int authFailureReason) { 173346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne switch (authFailureReason) { 173446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.AUTH_FAILURE_NONE: 173546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "ERROR_AUTH_FAILURE_NONE"; 173646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.AUTH_FAILURE_TIMEOUT: 173746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "ERROR_AUTH_FAILURE_TIMEOUT"; 173846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.AUTH_FAILURE_WRONG_PSWD: 173946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "ERROR_AUTH_FAILURE_WRONG_PSWD"; 174046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.AUTH_FAILURE_EAP_FAILURE: 174146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "ERROR_AUTH_FAILURE_EAP_FAILURE"; 174246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne default: 174346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return ""; 174446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 174546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 174646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 174746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static String frameworkDisconnectReasonToString(int frameworkDisconnectReason) { 174846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne switch (frameworkDisconnectReason) { 174946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.DISCONNECT_API: 175046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "DISCONNECT_API"; 175146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.DISCONNECT_GENERIC: 175246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "DISCONNECT_GENERIC"; 175346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.DISCONNECT_UNWANTED: 175446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "DISCONNECT_UNWANTED"; 175546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.DISCONNECT_ROAM_WATCHDOG_TIMER: 175646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "DISCONNECT_ROAM_WATCHDOG_TIMER"; 175746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.DISCONNECT_P2P_DISCONNECT_WIFI_REQUEST: 175846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "DISCONNECT_P2P_DISCONNECT_WIFI_REQUEST"; 175946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne case StaEvent.DISCONNECT_RESET_SIM_NETWORKS: 176046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "DISCONNECT_RESET_SIM_NETWORKS"; 176146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne default: 176246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return "DISCONNECT_UNKNOWN=" + frameworkDisconnectReason; 176346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 176446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 176546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 176646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static String configInfoToString(ConfigInfo info) { 176746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne StringBuilder sb = new StringBuilder(); 176846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne sb.append("ConfigInfo:") 176946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" allowed_key_management=").append(info.allowedKeyManagement) 177046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" allowed_protocols=").append(info.allowedProtocols) 177146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" allowed_auth_algorithms=").append(info.allowedAuthAlgorithms) 177246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" allowed_pairwise_ciphers=").append(info.allowedPairwiseCiphers) 177346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" allowed_group_ciphers=").append(info.allowedGroupCiphers) 177446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" hidden_ssid=").append(info.hiddenSsid) 177546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" is_passpoint=").append(info.isPasspoint) 177646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" is_ephemeral=").append(info.isEphemeral) 177746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" has_ever_connected=").append(info.hasEverConnected) 177846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" scan_rssi=").append(info.scanRssi) 177946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne .append(" scan_freq=").append(info.scanFreq); 178046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return sb.toString(); 178146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 178246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 178346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne public static final int MAX_STA_EVENTS = 512; 178446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private LinkedList<StaEvent> mStaEventList = new LinkedList<StaEvent>(); 178546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private int mLastPollRssi = -127; 178646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private int mLastPollLinkSpeed = -1; 178746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private int mLastPollFreq = -1; 178846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne 178946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne /** 179046c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne * Converts the first 31 bits of a BitSet to a little endian int 179146c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne */ 179246c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne private static int bitSetToInt(BitSet bits) { 179346c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne int value = 0; 179446c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne int nBits = bits.length() < 31 ? bits.length() : 31; 179546c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne for (int i = 0; i < nBits; i++) { 179646c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne value += bits.get(i) ? (1 << i) : 0; 179746c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 179846c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne return value; 179946c84f9fd984cc4b67f5252e30bce7f756be558cGlen Kuhne } 18001b067831bbff14f8e7a99b927b69f714d1b03448Glen Kuhne} 1801