diff options
author | Dan Pasanen <dan.pasanen@gmail.com> | 2018-04-03 10:30:35 -0500 |
---|---|---|
committer | Dan Pasanen <dan.pasanen@gmail.com> | 2018-04-03 10:30:35 -0500 |
commit | e0f48b975501e131179f17763b2bbe153f726380 (patch) | |
tree | 4e1ed95d4012a923867c18e208894641dbbadd8c /service/java/com | |
parent | f6338ae435156561548c0b15ffb89ebdc64b0e9f (diff) | |
parent | 2bb42242ccfcf9f3c1a0e89b83fb90b1dd9212f7 (diff) | |
download | android_frameworks_opt_net_wifi-e0f48b975501e131179f17763b2bbe153f726380.tar.gz android_frameworks_opt_net_wifi-e0f48b975501e131179f17763b2bbe153f726380.tar.bz2 android_frameworks_opt_net_wifi-e0f48b975501e131179f17763b2bbe153f726380.zip |
Merge tag 'android-8.1.0_r20' into lineage-15.1
Android 8.1.0 release 20
Change-Id: Iebfa8f4da5f699428a25c2d0c7248497248e21d1
Diffstat (limited to 'service/java/com')
-rw-r--r-- | service/java/com/android/server/wifi/WifiMetrics.java | 137 |
1 files changed, 135 insertions, 2 deletions
diff --git a/service/java/com/android/server/wifi/WifiMetrics.java b/service/java/com/android/server/wifi/WifiMetrics.java index 071b4f883..a8ad08c65 100644 --- a/service/java/com/android/server/wifi/WifiMetrics.java +++ b/service/java/com/android/server/wifi/WifiMetrics.java @@ -31,11 +31,14 @@ import android.util.Log; import android.util.Pair; import android.util.SparseIntArray; +import com.android.internal.annotations.VisibleForTesting; import com.android.server.wifi.aware.WifiAwareMetrics; +import com.android.server.wifi.hotspot2.ANQPNetworkKey; import com.android.server.wifi.hotspot2.NetworkDetail; import com.android.server.wifi.hotspot2.PasspointManager; import com.android.server.wifi.hotspot2.PasspointMatch; import com.android.server.wifi.hotspot2.PasspointProvider; +import com.android.server.wifi.hotspot2.Utils; import com.android.server.wifi.nano.WifiMetricsProto; import com.android.server.wifi.nano.WifiMetricsProto.ConnectToNetworkNotificationAndActionCount; import com.android.server.wifi.nano.WifiMetricsProto.PnoScanMetrics; @@ -49,9 +52,11 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.BitSet; import java.util.Calendar; +import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.Set; /** @@ -76,6 +81,8 @@ public class WifiMetrics { public static final long TIMEOUT_RSSI_DELTA_MILLIS = 3000; private static final int MIN_WIFI_SCORE = 0; private static final int MAX_WIFI_SCORE = NetworkAgent.WIFI_BASE_SCORE; + @VisibleForTesting + static final int LOW_WIFI_SCORE = 50; // Mobile data score private final Object mLock = new Object(); private static final int MAX_CONNECTION_EVENTS = 256; // Largest bucket in the NumConnectableNetworkCount histogram, @@ -84,6 +91,9 @@ public class WifiMetrics { public static final int MAX_CONNECTABLE_BSSID_NETWORK_BUCKET = 50; public static final int MAX_TOTAL_SCAN_RESULT_SSIDS_BUCKET = 100; public static final int MAX_TOTAL_SCAN_RESULTS_BUCKET = 250; + public static final int MAX_TOTAL_PASSPOINT_APS_BUCKET = 50; + public static final int MAX_TOTAL_PASSPOINT_UNIQUE_ESS_BUCKET = 20; + public static final int MAX_PASSPOINT_APS_PER_UNIQUE_ESS_BUCKET = 50; private static final int CONNECT_TO_NETWORK_NOTIFICATION_ACTION_KEY_MULTIPLIER = 1000; private Clock mClock; private boolean mScreenOn; @@ -161,6 +171,13 @@ public class WifiMetrics { private int mNumOpenNetworkConnectMessageFailedToSend = 0; private int mNumOpenNetworkRecommendationUpdates = 0; + private final SparseIntArray mObservedHotspotR1ApInScanHistogram = new SparseIntArray(); + private final SparseIntArray mObservedHotspotR2ApInScanHistogram = new SparseIntArray(); + private final SparseIntArray mObservedHotspotR1EssInScanHistogram = new SparseIntArray(); + private final SparseIntArray mObservedHotspotR2EssInScanHistogram = new SparseIntArray(); + private final SparseIntArray mObservedHotspotR1ApsPerEssInScanHistogram = new SparseIntArray(); + private final SparseIntArray mObservedHotspotR2ApsPerEssInScanHistogram = new SparseIntArray(); + class RouterFingerPrint { private WifiMetricsProto.RouterFingerPrint mRouterFingerPrintProto; RouterFingerPrint() { @@ -1041,10 +1058,14 @@ public class WifiMetrics { } } + private boolean mWifiWins = false; // Based on scores, use wifi instead of mobile data? + /** * Increments occurence of a particular wifi score calculated * in WifiScoreReport by current connected network. Scores are bounded - * within [MIN_WIFI_SCORE, MAX_WIFI_SCORE] to limit size of SparseArray + * within [MIN_WIFI_SCORE, MAX_WIFI_SCORE] to limit size of SparseArray. + * + * Also records events when the current score breaches significant thresholds. */ public void incrementWifiScoreCount(int score) { if (score < MIN_WIFI_SCORE || score > MAX_WIFI_SCORE) { @@ -1053,6 +1074,20 @@ public class WifiMetrics { synchronized (mLock) { int count = mWifiScoreCounts.get(score); mWifiScoreCounts.put(score, count + 1); + + boolean wifiWins = mWifiWins; + if (mWifiWins && score < LOW_WIFI_SCORE) { + wifiWins = false; + } else if (!mWifiWins && score > LOW_WIFI_SCORE) { + wifiWins = true; + } + mLastScore = score; + if (wifiWins != mWifiWins) { + mWifiWins = wifiWins; + StaEvent event = new StaEvent(); + event.type = StaEvent.TYPE_SCORE_BREACH; + addStaEvent(event); + } } } @@ -1192,6 +1227,10 @@ public class WifiMetrics { Set<PasspointProvider> savedPasspointProviderProfiles = new HashSet<PasspointProvider>(); int savedPasspointProviderBssids = 0; + int passpointR1Aps = 0; + int passpointR2Aps = 0; + Map<ANQPNetworkKey, Integer> passpointR1UniqueEss = new HashMap<>(); + Map<ANQPNetworkKey, Integer> passpointR2UniqueEss = new HashMap<>(); for (ScanDetail scanDetail : scanDetails) { NetworkDetail networkDetail = scanDetail.getNetworkDetail(); ScanResult scanResult = scanDetail.getScanResult(); @@ -1205,6 +1244,36 @@ public class WifiMetrics { providerMatch = mPasspointManager.matchProvider(scanResult); passpointProvider = providerMatch != null ? providerMatch.first : null; + + if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R1) { + passpointR1Aps++; + } else if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R2) { + passpointR2Aps++; + } + + long bssid = 0; + boolean validBssid = false; + try { + bssid = Utils.parseMac(scanResult.BSSID); + validBssid = true; + } catch (IllegalArgumentException e) { + Log.e(TAG, + "Invalid BSSID provided in the scan result: " + scanResult.BSSID); + } + if (validBssid) { + ANQPNetworkKey uniqueEss = ANQPNetworkKey.buildKey(scanResult.SSID, bssid, + scanResult.hessid, networkDetail.getAnqpDomainID()); + if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R1) { + Integer countObj = passpointR1UniqueEss.get(uniqueEss); + int count = countObj == null ? 0 : countObj; + passpointR1UniqueEss.put(uniqueEss, count + 1); + } else if (networkDetail.getHSRelease() == NetworkDetail.HSRelease.R2) { + Integer countObj = passpointR2UniqueEss.get(uniqueEss); + int count = countObj == null ? 0 : countObj; + passpointR2UniqueEss.put(uniqueEss, count + 1); + } + } + } ssids.add(matchInfo); bssids++; @@ -1245,6 +1314,18 @@ public class WifiMetrics { savedPasspointProviderProfiles.size()); incrementBssid(mAvailableSavedPasspointProviderBssidsInScanHistogram, savedPasspointProviderBssids); + incrementTotalPasspointAps(mObservedHotspotR1ApInScanHistogram, passpointR1Aps); + incrementTotalPasspointAps(mObservedHotspotR2ApInScanHistogram, passpointR2Aps); + incrementTotalUniquePasspointEss(mObservedHotspotR1EssInScanHistogram, + passpointR1UniqueEss.size()); + incrementTotalUniquePasspointEss(mObservedHotspotR2EssInScanHistogram, + passpointR2UniqueEss.size()); + for (Integer count : passpointR1UniqueEss.values()) { + incrementPasspointPerUniqueEss(mObservedHotspotR1ApsPerEssInScanHistogram, count); + } + for (Integer count : passpointR2UniqueEss.values()) { + incrementPasspointPerUniqueEss(mObservedHotspotR2ApsPerEssInScanHistogram, count); + } } } @@ -1561,6 +1642,19 @@ public class WifiMetrics { + mNumOpenNetworkRecommendationUpdates); pw.println("mWifiLogProto.numOpenNetworkConnectMessageFailedToSend=" + mNumOpenNetworkConnectMessageFailedToSend); + + pw.println("mWifiLogProto.observedHotspotR1ApInScanHistogram=" + + mObservedHotspotR1ApInScanHistogram); + pw.println("mWifiLogProto.observedHotspotR2ApInScanHistogram=" + + mObservedHotspotR2ApInScanHistogram); + pw.println("mWifiLogProto.observedHotspotR1EssInScanHistogram=" + + mObservedHotspotR1EssInScanHistogram); + pw.println("mWifiLogProto.observedHotspotR2EssInScanHistogram=" + + mObservedHotspotR2EssInScanHistogram); + pw.println("mWifiLogProto.observedHotspotR1ApsPerEssInScanHistogram=" + + mObservedHotspotR1ApsPerEssInScanHistogram); + pw.println("mWifiLogProto.observedHotspotR2ApsPerEssInScanHistogram=" + + mObservedHotspotR2ApsPerEssInScanHistogram); } } } @@ -1818,6 +1912,21 @@ public class WifiMetrics { mNumOpenNetworkRecommendationUpdates; mWifiLogProto.numOpenNetworkConnectMessageFailedToSend = mNumOpenNetworkConnectMessageFailedToSend; + + mWifiLogProto.observedHotspotR1ApsInScanHistogram = + makeNumConnectableNetworksBucketArray(mObservedHotspotR1ApInScanHistogram); + mWifiLogProto.observedHotspotR2ApsInScanHistogram = + makeNumConnectableNetworksBucketArray(mObservedHotspotR2ApInScanHistogram); + mWifiLogProto.observedHotspotR1EssInScanHistogram = + makeNumConnectableNetworksBucketArray(mObservedHotspotR1EssInScanHistogram); + mWifiLogProto.observedHotspotR2EssInScanHistogram = + makeNumConnectableNetworksBucketArray(mObservedHotspotR2EssInScanHistogram); + mWifiLogProto.observedHotspotR1ApsPerEssInScanHistogram = + makeNumConnectableNetworksBucketArray( + mObservedHotspotR1ApsPerEssInScanHistogram); + mWifiLogProto.observedHotspotR2ApsPerEssInScanHistogram = + makeNumConnectableNetworksBucketArray( + mObservedHotspotR2ApsPerEssInScanHistogram); } } @@ -1872,6 +1981,12 @@ public class WifiMetrics { mConnectToNetworkNotificationActionCount.clear(); mNumOpenNetworkRecommendationUpdates = 0; mNumOpenNetworkConnectMessageFailedToSend = 0; + mObservedHotspotR1ApInScanHistogram.clear(); + mObservedHotspotR2ApInScanHistogram.clear(); + mObservedHotspotR1EssInScanHistogram.clear(); + mObservedHotspotR2EssInScanHistogram.clear(); + mObservedHotspotR1ApsPerEssInScanHistogram.clear(); + mObservedHotspotR2ApsPerEssInScanHistogram.clear(); } } @@ -1890,6 +2005,7 @@ public class WifiMetrics { public void setWifiState(int wifiState) { synchronized (mLock) { mWifiState = wifiState; + mWifiWins = (wifiState == WifiMetricsProto.WifiLog.WIFI_ASSOCIATED); } } @@ -1995,6 +2111,7 @@ public class WifiMetrics { case StaEvent.TYPE_CONNECT_NETWORK: case StaEvent.TYPE_NETWORK_AGENT_VALID_NETWORK: case StaEvent.TYPE_FRAMEWORK_DISCONNECT: + case StaEvent.TYPE_SCORE_BREACH: break; default: Log.e(TAG, "Unknown StaEvent:" + type); @@ -2015,10 +2132,12 @@ public class WifiMetrics { staEvent.lastFreq = mLastPollFreq; staEvent.lastLinkSpeed = mLastPollLinkSpeed; staEvent.supplicantStateChangesBitmask = mSupplicantStateChangeBitmask; + staEvent.lastScore = mLastScore; mSupplicantStateChangeBitmask = 0; mLastPollRssi = -127; mLastPollFreq = -1; mLastPollLinkSpeed = -1; + mLastScore = -1; mStaEventList.add(new StaEventWithTime(staEvent, mClock.getWallClockMillis())); // Prune StaEventList if it gets too long if (mStaEventList.size() > MAX_STA_EVENTS) mStaEventList.remove(); @@ -2174,6 +2293,9 @@ public class WifiMetrics { .append(" reason=") .append(frameworkDisconnectReasonToString(event.frameworkDisconnectReason)); break; + case StaEvent.TYPE_SCORE_BREACH: + sb.append("SCORE_BREACH"); + break; default: sb.append("UNKNOWN " + event.type + ":"); break; @@ -2181,6 +2303,7 @@ public class WifiMetrics { if (event.lastRssi != -127) sb.append(" lastRssi=").append(event.lastRssi); if (event.lastFreq != -1) sb.append(" lastFreq=").append(event.lastFreq); if (event.lastLinkSpeed != -1) sb.append(" lastLinkSpeed=").append(event.lastLinkSpeed); + if (event.lastScore != -1) sb.append(" lastScore=").append(event.lastScore); if (event.supplicantStateChangesBitmask != 0) { sb.append(", ").append(supplicantStateChangesBitmaskToString( event.supplicantStateChangesBitmask)); @@ -2243,11 +2366,12 @@ public class WifiMetrics { return sb.toString(); } - public static final int MAX_STA_EVENTS = 512; + public static final int MAX_STA_EVENTS = 768; private LinkedList<StaEventWithTime> mStaEventList = new LinkedList<StaEventWithTime>(); private int mLastPollRssi = -127; private int mLastPollLinkSpeed = -1; private int mLastPollFreq = -1; + private int mLastScore = -1; /** * Converts the first 31 bits of a BitSet to a little endian int @@ -2272,6 +2396,15 @@ public class WifiMetrics { private void incrementTotalScanSsids(SparseIntArray sia, int element) { increment(sia, Math.min(element, MAX_TOTAL_SCAN_RESULT_SSIDS_BUCKET)); } + private void incrementTotalPasspointAps(SparseIntArray sia, int element) { + increment(sia, Math.min(element, MAX_TOTAL_PASSPOINT_APS_BUCKET)); + } + private void incrementTotalUniquePasspointEss(SparseIntArray sia, int element) { + increment(sia, Math.min(element, MAX_TOTAL_PASSPOINT_UNIQUE_ESS_BUCKET)); + } + private void incrementPasspointPerUniqueEss(SparseIntArray sia, int element) { + increment(sia, Math.min(element, MAX_PASSPOINT_APS_PER_UNIQUE_ESS_BUCKET)); + } private void increment(SparseIntArray sia, int element) { int count = sia.get(element); sia.put(element, count + 1); |