diff options
author | Jong Wook Kim <jongwook@google.com> | 2018-04-09 10:13:53 -0700 |
---|---|---|
committer | Jong Wook Kim <jongwook@google.com> | 2018-04-24 15:42:54 -0700 |
commit | 28a6c752451084392a71b3c70d984ef9e066d4e2 (patch) | |
tree | 7e7b297485d9496f33631a55e1e20c4f8937cbc2 | |
parent | 61b3c8fc8d4af0ed5283520dcd7b40723721d720 (diff) |
Wifi Framework Connected MAC Randomization Metrics
Record metrics related to Connected MAC Randomization feature.
1) Update whether the feature is turned on/off in metrics.
2) Trigger StaEvent whenever the device is dynamically changing its MAC
address.
Also, change MAC randomization logging in WifiStateMachine.
Bug: 73666905
Test: Unittest
Test: Manual check
Change-Id: I3a34d6adb877fa7c8738252363c4cc1921bb1d7e
4 files changed, 55 insertions, 9 deletions
diff --git a/service/java/com/android/server/wifi/WifiMetrics.java b/service/java/com/android/server/wifi/WifiMetrics.java index 584e51043..5bb23b060 100644 --- a/service/java/com/android/server/wifi/WifiMetrics.java +++ b/service/java/com/android/server/wifi/WifiMetrics.java @@ -198,6 +198,8 @@ public class WifiMetrics { /** Wifi Wake metrics */ private final WifiWakeMetrics mWifiWakeMetrics = new WifiWakeMetrics(); + private boolean mIsMacRandomizationOn = false; + class RouterFingerPrint { private WifiMetricsProto.RouterFingerPrint mRouterFingerPrintProto; RouterFingerPrint() { @@ -1707,6 +1709,13 @@ public class WifiMetrics { } } + /** Sets if Connected MAC Randomization feature is enabled */ + public void setIsMacRandomizationOn(boolean enabled) { + synchronized (mLock) { + mIsMacRandomizationOn = enabled; + } + } + public static final String PROTO_DUMP_ARG = "wifiMetricsProto"; public static final String CLEAN_DUMP_ARG = "clean"; @@ -2050,6 +2059,8 @@ public class WifiMetrics { mWifiPowerMetrics.dump(pw); mWifiWakeMetrics.dump(pw); + + pw.println("mWifiLogProto.isMacRandomizationOn=" + mIsMacRandomizationOn); } } } @@ -2341,6 +2352,7 @@ public class WifiMetrics { mWifiLogProto.wpsMetrics = mWpsMetrics; mWifiLogProto.wifiPowerStats = mWifiPowerMetrics.buildProto(); mWifiLogProto.wifiWakeStats = mWifiWakeMetrics.buildProto(); + mWifiLogProto.isMacRandomizationOn = mIsMacRandomizationOn; } } @@ -2532,6 +2544,7 @@ public class WifiMetrics { case StaEvent.TYPE_NETWORK_AGENT_VALID_NETWORK: case StaEvent.TYPE_FRAMEWORK_DISCONNECT: case StaEvent.TYPE_SCORE_BREACH: + case StaEvent.TYPE_MAC_CHANGE: break; default: Log.e(TAG, "Unknown StaEvent:" + type); @@ -2724,6 +2737,9 @@ public class WifiMetrics { case StaEvent.TYPE_SCORE_BREACH: sb.append("SCORE_BREACH"); break; + case StaEvent.TYPE_MAC_CHANGE: + sb.append("MAC_CHANGE"); + break; default: sb.append("UNKNOWN " + event.type + ":"); break; diff --git a/service/java/com/android/server/wifi/WifiStateMachine.java b/service/java/com/android/server/wifi/WifiStateMachine.java index 10b55b9d5..d478e971c 100644 --- a/service/java/com/android/server/wifi/WifiStateMachine.java +++ b/service/java/com/android/server/wifi/WifiStateMachine.java @@ -3267,15 +3267,14 @@ public class WifiStateMachine extends StateMachine { if (!WifiConfiguration.isValidMacAddressForRandomization(newMac)) { Log.wtf(TAG, "Config generated an invalid MAC address"); } else if (currentMac.equals(newMac)) { - Log.i(TAG, "No changes in MAC address"); + Log.d(TAG, "No changes in MAC address"); } else { - Log.i(TAG, "ConnectedMacRandomization SSID(" + config.getPrintableSsid() - + "). setMacAddress(" + newMac.toString() + ") from " - + currentMac.toString()); + mWifiMetrics.logStaEvent(StaEvent.TYPE_MAC_CHANGE, config); boolean setMacSuccess = mWifiNative.setMacAddress(mInterfaceName, newMac); - Log.i(TAG, "ConnectedMacRandomization ...setMacAddress(" - + newMac.toString() + ") = " + setMacSuccess); + Log.d(TAG, "ConnectedMacRandomization SSID(" + config.getPrintableSsid() + + "). setMacAddress(" + newMac.toString() + ") from " + + currentMac.toString() + " = " + setMacSuccess); } } @@ -3289,6 +3288,7 @@ public class WifiStateMachine extends StateMachine { boolean macRandomizationEnabled = (macRandomizationFlag == 1); mEnableConnectedMacRandomization.set(macRandomizationEnabled); mWifiInfo.setEnableConnectedMacRandomization(macRandomizationEnabled); + mWifiMetrics.setIsMacRandomizationOn(macRandomizationEnabled); Log.d(TAG, "EnableConnectedMacRandomization Setting changed to " + macRandomizationEnabled); } diff --git a/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java b/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java index 8212169dc..91f58c451 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java @@ -307,6 +307,7 @@ public class WifiMetricsTest { private static final int NUM_SOFT_AP_ASSOCIATED_STATIONS = 3; private static final int SOFT_AP_CHANNEL_FREQUENCY = 2437; private static final int SOFT_AP_CHANNEL_BANDWIDTH = SoftApConnectedClientsEvent.BANDWIDTH_20; + private static final boolean IS_MAC_RANDOMIZATION_ON = true; private ScanDetail buildMockScanDetail(boolean hidden, NetworkDetail.HSRelease hSRelease, String capabilities) { @@ -662,6 +663,7 @@ public class WifiMetricsTest { } mWifiMetrics.setWatchdogSuccessTimeDurationMs(NUM_WATCHDOG_SUCCESS_DURATION_MS); + mWifiMetrics.setIsMacRandomizationOn(IS_MAC_RANDOMIZATION_ON); } private void addSoftApEventsToMetrics() { @@ -930,6 +932,7 @@ public class WifiMetricsTest { assertEquals(NUM_WATCHDOG_SUCCESS_DURATION_MS, mDecodedProto.watchdogTriggerToConnectionSuccessDurationMs); + assertEquals(IS_MAC_RANDOMIZATION_ON, mDecodedProto.isMacRandomizationOn); } /** @@ -1299,7 +1302,7 @@ public class WifiMetricsTest { private static final int ASSOC_TIMEOUT = 1; private static final int LOCAL_GEN = 1; private static final int AUTH_FAILURE_REASON = WifiManager.ERROR_AUTH_FAILURE_WRONG_PSWD; - private static final int NUM_TEST_STA_EVENTS = 15; + private static final int NUM_TEST_STA_EVENTS = 16; private static final String sSSID = "\"SomeTestSsid\""; private static final WifiSsid sWifiSsid = WifiSsid.createFromAsciiEncoded(sSSID); private static final String sBSSID = "01:02:03:04:05:06"; @@ -1348,7 +1351,8 @@ public class WifiMetricsTest { {StaEvent.TYPE_CONNECT_NETWORK, 0, 1}, {StaEvent.TYPE_NETWORK_AGENT_VALID_NETWORK, 0, 0}, {StaEvent.TYPE_FRAMEWORK_DISCONNECT, StaEvent.DISCONNECT_API, 0}, - {StaEvent.TYPE_SCORE_BREACH, 0, 0} + {StaEvent.TYPE_SCORE_BREACH, 0, 0}, + {StaEvent.TYPE_MAC_CHANGE, 0, 1} }; // Values used to generate the StaEvent log calls from WifiMonitor // <type>, <reason>, <status>, <local_gen>, @@ -1383,7 +1387,9 @@ public class WifiMetricsTest { {StaEvent.TYPE_FRAMEWORK_DISCONNECT, -1, -1, 0, /**/ 0, 0, 0, 0}, /**/ {StaEvent.TYPE_SCORE_BREACH, -1, -1, 0, - /**/ 0, 0, 0, 0} /**/ + /**/ 0, 0, 0, 0}, /**/ + {StaEvent.TYPE_MAC_CHANGE, -1, -1, 0, + /**/ 0, 0, 0, 1} /**/ }; /** diff --git a/tests/wifitests/src/com/android/server/wifi/WifiStateMachineTest.java b/tests/wifitests/src/com/android/server/wifi/WifiStateMachineTest.java index 1907c56b7..93bf2d52d 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiStateMachineTest.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiStateMachineTest.java @@ -91,6 +91,7 @@ import com.android.internal.util.StateMachine; import com.android.server.wifi.hotspot2.NetworkDetail; import com.android.server.wifi.hotspot2.PasspointManager; import com.android.server.wifi.hotspot2.PasspointProvisioningTestUtil; +import com.android.server.wifi.nano.WifiMetricsProto.StaEvent; import com.android.server.wifi.p2p.WifiP2pServiceImpl; import com.android.server.wifi.util.WifiPermissionsUtil; import com.android.server.wifi.util.WifiPermissionsWrapper; @@ -2312,6 +2313,8 @@ public class WifiStateMachineTest { assertNotEquals(TEST_GLOBAL_MAC_ADDRESS, newMac); verify(mWifiConfigManager).setNetworkRandomizedMacAddress(eq(0), eq(newMac)); verify(mWifiNative).setMacAddress(eq(WIFI_IFACE_NAME), eq(newMac)); + verify(mWifiMetrics) + .logStaEvent(eq(StaEvent.TYPE_MAC_CHANGE), any(WifiConfiguration.class)); assertEquals(mWsm.getWifiInfo().getMacAddress(), newMac.toString()); } @@ -2358,6 +2361,8 @@ public class WifiStateMachineTest { verify(mWifiConfigManager, never()) .setNetworkRandomizedMacAddress(eq(0), any(MacAddress.class)); verify(mWifiNative, never()).setMacAddress(eq(WIFI_IFACE_NAME), any(MacAddress.class)); + verify(mWifiMetrics, never()) + .logStaEvent(eq(StaEvent.TYPE_MAC_CHANGE), any(WifiConfiguration.class)); assertEquals(mWsm.getWifiInfo().getMacAddress(), oldMac); } @@ -2391,6 +2396,25 @@ public class WifiStateMachineTest { } /** + * Verifies that turning on/off Connected MAC Randomization correctly updates metrics. + */ + @Test + public void testUpdateConnectedMacRandomizationSettingMetrics() throws Exception { + // Called during setUp + verify(mWifiMetrics).setIsMacRandomizationOn(false); + + when(mFrameworkFacade.getIntegerSetting(mContext, + Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED, 0)).thenReturn(1); + mContentObserver.onChange(false); + verify(mWifiMetrics).setIsMacRandomizationOn(true); + + when(mFrameworkFacade.getIntegerSetting(mContext, + Settings.Global.WIFI_CONNECTED_MAC_RANDOMIZATION_ENABLED, 0)).thenReturn(0); + mContentObserver.onChange(false); + verify(mWifiMetrics, times(2)).setIsMacRandomizationOn(false); + } + + /** * Verify that we do not crash on quick toggling wifi on/off */ @Test |