From cfdd5f1d6acbfb6706a88618cf853a26faa8adc0 Mon Sep 17 00:00:00 2001 From: Gabriel Biren Date: Wed, 19 Mar 2025 22:26:12 +0000 Subject: Log WifiMulticastLockManager acquired sessions in WifiMetrics when locks are released. Bug: 391378901 Flag: EXEMPT minor metrics feature Test: atest WifiInjectorTest \ WifiMulticastLockManagerTest Change-Id: Ie593dc64d97210b29ca657d3bb5b1254caf5eae2 --- .../java/com/android/server/wifi/WifiInjector.java | 2 +- .../server/wifi/WifiMulticastLockManager.java | 22 ++++++++++++++++++++- .../server/wifi/WifiMulticastLockManagerTest.java | 23 +++++++++++++++++++++- 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/service/java/com/android/server/wifi/WifiInjector.java b/service/java/com/android/server/wifi/WifiInjector.java index 300f850d51..6a62336fe6 100644 --- a/service/java/com/android/server/wifi/WifiInjector.java +++ b/service/java/com/android/server/wifi/WifiInjector.java @@ -607,7 +607,7 @@ public class WifiInjector { mSelfRecovery = new SelfRecovery(mContext, mActiveModeWarden, mClock, mWifiNative, mWifiGlobals); mWifiMulticastLockManager = new WifiMulticastLockManager(mActiveModeWarden, mBatteryStats, - wifiLooper, mContext); + wifiLooper, mContext, mClock, mWifiMetrics, mWifiPermissionsUtil); mApplicationQosPolicyRequestHandler = new ApplicationQosPolicyRequestHandler( mActiveModeWarden, mWifiNative, mWifiHandlerThread, mDeviceConfigFacade, mContext); diff --git a/service/java/com/android/server/wifi/WifiMulticastLockManager.java b/service/java/com/android/server/wifi/WifiMulticastLockManager.java index e25d9c86c6..f02efc3d74 100644 --- a/service/java/com/android/server/wifi/WifiMulticastLockManager.java +++ b/service/java/com/android/server/wifi/WifiMulticastLockManager.java @@ -29,6 +29,7 @@ import android.os.WorkSource; import android.util.Log; import com.android.server.wifi.proto.WifiStatsLog; +import com.android.server.wifi.util.WifiPermissionsUtil; import java.io.PrintWriter; import java.util.ArrayList; @@ -54,6 +55,9 @@ public class WifiMulticastLockManager { private boolean mVerboseLoggingEnabled = false; private final BatteryStatsManager mBatteryStats; private final ActiveModeWarden mActiveModeWarden; + private final Clock mClock; + private final WifiMetrics mWifiMetrics; + private final WifiPermissionsUtil mWifiPermissionsUtil; /** Delegate for handling state change events for multicast filtering. */ public interface FilterController { @@ -68,10 +72,16 @@ public class WifiMulticastLockManager { ActiveModeWarden activeModeWarden, BatteryStatsManager batteryStats, Looper looper, - Context context) { + Context context, + Clock clock, + WifiMetrics wifiMetrics, + WifiPermissionsUtil wifiPermissionsUtil) { mBatteryStats = batteryStats; mActiveModeWarden = activeModeWarden; mHandler = new Handler(looper); + mClock = clock; + mWifiMetrics = wifiMetrics; + mWifiPermissionsUtil = wifiPermissionsUtil; mActiveModeWarden.registerPrimaryClientModeManagerChangedCallback( new PrimaryClientModeManagerChangedCallback()); @@ -91,6 +101,7 @@ public class WifiMulticastLockManager { IBinder mBinder; String mAttributionTag; String mPackageName; + long mAcquireTime; Multicaster(int uid, IBinder binder, String tag, String attributionTag, String packageName) { @@ -99,6 +110,7 @@ public class WifiMulticastLockManager { mBinder = binder; mAttributionTag = attributionTag; mPackageName = packageName; + mAcquireTime = mClock.getElapsedSinceBootMillis(); try { mBinder.linkToDeath(this, 0); } catch (RemoteException e) { @@ -143,6 +155,10 @@ public class WifiMulticastLockManager { return mPackageName; } + public long getAcquireTime() { + return mAcquireTime; + } + public String toString() { return "Multicaster{" + mTag + " uid=" + mUid + "}"; } @@ -299,6 +315,10 @@ public class WifiMulticastLockManager { Multicaster removed = mMulticasters.remove(i); if (removed != null) { removed.unlinkDeathRecipient(); + mWifiMetrics.addMulticastLockManagerAcqSession( + uid, removed.getAttributionTag(), + mWifiPermissionsUtil.getWifiCallerType(uid, removed.getPackageName()), + mClock.getElapsedSinceBootMillis() - removed.getAcquireTime()); } if (mNumLocksPerActiveOwner.containsKey(uid)) { diff --git a/service/tests/wifitests/src/com/android/server/wifi/WifiMulticastLockManagerTest.java b/service/tests/wifitests/src/com/android/server/wifi/WifiMulticastLockManagerTest.java index 1e80cbc6b8..eb290241b1 100644 --- a/service/tests/wifitests/src/com/android/server/wifi/WifiMulticastLockManagerTest.java +++ b/service/tests/wifitests/src/com/android/server/wifi/WifiMulticastLockManagerTest.java @@ -34,6 +34,7 @@ import androidx.test.filters.SmallTest; import com.android.server.wifi.ActiveModeWarden.PrimaryClientModeManagerChangedCallback; import com.android.server.wifi.WifiMulticastLockManager.FilterController; +import com.android.server.wifi.util.WifiPermissionsUtil; import org.junit.Before; import org.junit.Test; @@ -54,6 +55,7 @@ public class WifiMulticastLockManagerTest extends WifiBaseTest { private static final int TEST_UID = 123; private static final String TEST_ATTRIBUTION_TAG = "attribution-tag"; private static final String TEST_PACKAGE_NAME = "package-name"; + private static final long START_TIME = 0; private TestLooper mLooper; @Mock ConcreteClientModeManager mClientModeManager; @@ -64,6 +66,9 @@ public class WifiMulticastLockManagerTest extends WifiBaseTest { @Mock ActiveModeWarden mActiveModeWarden; @Mock Context mContext; @Mock ActivityManager mActivityManager; + @Mock Clock mClock; + @Mock WifiMetrics mWifiMetrics; + @Mock WifiPermissionsUtil mWifiPermissionsUtil; @Captor ArgumentCaptor mPrimaryChangedCallbackCaptor; @Captor ArgumentCaptor mUidImportanceListenerCaptor = ArgumentCaptor.forClass(ActivityManager.OnUidImportanceListener.class); @@ -88,7 +93,7 @@ public class WifiMulticastLockManagerTest extends WifiBaseTest { when(mActiveModeWarden.getPrimaryClientModeManager()).thenReturn(mClientModeManager); when(mContext.getSystemService(ActivityManager.class)).thenReturn(mActivityManager); mManager = new WifiMulticastLockManager(mActiveModeWarden, mBatteryStats, - mLooper.getLooper(), mContext); + mLooper.getLooper(), mContext, mClock, mWifiMetrics, mWifiPermissionsUtil); verify(mActiveModeWarden).registerPrimaryClientModeManagerChangedCallback( mPrimaryChangedCallbackCaptor.capture()); @@ -385,4 +390,20 @@ public class WifiMulticastLockManagerTest extends WifiBaseTest { assertFalse(mManager.isMulticastEnabled()); verify(mFilterController, times(2)).startFilteringMulticastPackets(); } + + /** + * Verify that an acquire session is logged in the metrics when a lock is released. + */ + @Test + public void testAcquireSessionMetrics() { + IBinder binder = mock(IBinder.class); + when(mClock.getElapsedSinceBootMillis()).thenReturn(START_TIME); + mManager.acquireLock(TEST_UID, binder, WL_1_TAG, TEST_ATTRIBUTION_TAG, TEST_PACKAGE_NAME); + + // Advance clock by 10 ms and release the lock + when(mClock.getElapsedSinceBootMillis()).thenReturn(START_TIME + 10); + mManager.releaseLock(TEST_UID, binder, WL_1_TAG); + verify(mWifiMetrics).addMulticastLockManagerAcqSession( + eq(TEST_UID), eq(TEST_ATTRIBUTION_TAG), anyInt(), eq(10L) /* duration */); + } } -- cgit v1.2.3-59-g8ed1b From 23bfefa7959a38bc48c8b9838885c247dfdedbea Mon Sep 17 00:00:00 2001 From: Gabriel Biren Date: Thu, 20 Mar 2025 23:37:15 +0000 Subject: Split addWifiLockActiveSession into separate methods for WifiLockManager and MulticastLockManager. Some of the existing logic does not apply to the metrics for multicast locks. Also see ag/32466544 where a similar split was done for the lock acquired method. Bug: 391378901 Flag: EXEMPT minor metrics feature Test: atest WifiLockManagerTest WifiMetricsTest Change-Id: Ia601da87163e5a9d0775569d66dcdc8805438832 --- .../com/android/server/wifi/WifiLockManager.java | 4 +- .../java/com/android/server/wifi/WifiMetrics.java | 26 +++++++- .../android/server/wifi/WifiLockManagerTest.java | 77 ++++++++++++---------- .../com/android/server/wifi/WifiMetricsTest.java | 16 ++--- 4 files changed, 77 insertions(+), 46 deletions(-) diff --git a/service/java/com/android/server/wifi/WifiLockManager.java b/service/java/com/android/server/wifi/WifiLockManager.java index 33833f4b9a..040aca88bc 100644 --- a/service/java/com/android/server/wifi/WifiLockManager.java +++ b/service/java/com/android/server/wifi/WifiLockManager.java @@ -732,7 +732,7 @@ public class WifiLockManager { return false; } uidsAndTags = WorkSourceUtil.getUidsAndTagsForWs(mHighPerfBlamedWorkSource); - mWifiMetrics.addWifiLockActiveSession(WifiManager.WIFI_MODE_FULL_HIGH_PERF, + mWifiMetrics.addWifiLockManagerActiveSession(WifiManager.WIFI_MODE_FULL_HIGH_PERF, uidsAndTags.first, uidsAndTags.second, mClock.getElapsedSinceBootMillis() - mCurrentSessionStartTimeMs, @@ -748,7 +748,7 @@ public class WifiLockManager { return false; } uidsAndTags = WorkSourceUtil.getUidsAndTagsForWs(mLowLatencyBlamedWorkSource); - mWifiMetrics.addWifiLockActiveSession(WifiManager.WIFI_MODE_FULL_LOW_LATENCY, + mWifiMetrics.addWifiLockManagerActiveSession(WifiManager.WIFI_MODE_FULL_LOW_LATENCY, uidsAndTags.first, uidsAndTags.second, mClock.getElapsedSinceBootMillis() - mCurrentSessionStartTimeMs, diff --git a/service/java/com/android/server/wifi/WifiMetrics.java b/service/java/com/android/server/wifi/WifiMetrics.java index 68ac00f1ef..52eac0d037 100644 --- a/service/java/com/android/server/wifi/WifiMetrics.java +++ b/service/java/com/android/server/wifi/WifiMetrics.java @@ -8968,8 +8968,11 @@ public class WifiMetrics { isAppExemptedFromForeground); } - /** Add a WifiLock active session */ - public void addWifiLockActiveSession(int lockType, int[] attrUids, String[] attrTags, + /** + * Add a WifiLockManager active session. This represents the session during which + * low-latency mode was enabled. + */ + public void addWifiLockManagerActiveSession(int lockType, int[] attrUids, String[] attrTags, long duration, boolean isPowersaveDisableAllowed, boolean isAppExemptedFromScreenOn, boolean isAppExemptedFromForeground) { int lockMode; @@ -8992,6 +8995,25 @@ public class WifiMetrics { Log.e(TAG, "addWifiLockActiveSession: Invalid lock type: " + lockType); return; } + writeWifiLockActiveSession(lockMode, attrUids, attrTags, duration, + isPowersaveDisableAllowed, isAppExemptedFromScreenOn, isAppExemptedFromForeground); + } + + /** + * Add a MulticastLockManager active session. This represents the session during which + * multicast packet filtering was disabled. + */ + public void addMulticastLockManagerActiveSession(long duration) { + // Use a default value for the array and boolean parameters, + // since these fields don't apply to multicast locks + writeWifiLockActiveSession( + WifiStatsLog.WIFI_LOCK_DEACTIVATED__MODE__WIFI_MODE_MULTICAST_FILTERING_DISABLED, + new int[0], new String[0], duration, false, false, false); + } + + private void writeWifiLockActiveSession(int lockMode, int[] attrUids, String[] attrTags, + long duration, boolean isPowersaveDisableAllowed, + boolean isAppExemptedFromScreenOn, boolean isAppExemptedFromForeground) { WifiStatsLog.write(WifiStatsLog.WIFI_LOCK_DEACTIVATED, attrUids, attrTags, diff --git a/service/tests/wifitests/src/com/android/server/wifi/WifiLockManagerTest.java b/service/tests/wifitests/src/com/android/server/wifi/WifiLockManagerTest.java index 64831e172d..cbdf1e80e0 100644 --- a/service/tests/wifitests/src/com/android/server/wifi/WifiLockManagerTest.java +++ b/service/tests/wifitests/src/com/android/server/wifi/WifiLockManagerTest.java @@ -597,7 +597,7 @@ public class WifiLockManagerTest extends WifiBaseTest { mLooper.dispatchAll(); inOrder.verify(mClientModeManager).setPowerSave(ClientMode.POWER_SAVE_CLIENT_WIFI_LOCK, true); - verify(mWifiMetrics).addWifiLockActiveSession(eq(expectedMode), + verify(mWifiMetrics).addWifiLockManagerActiveSession(eq(expectedMode), eq(new int[]{DEFAULT_TEST_UID_1}), eq(new String[]{null}), anyLong(), anyBoolean(), anyBoolean(), anyBoolean()); } @@ -646,15 +646,17 @@ public class WifiLockManagerTest extends WifiBaseTest { releaseWifiLockSuccessful(mBinder2); mLooper.moveTimeForward(DELAY_LOCK_RELEASE_MS + 1); mLooper.dispatchAll(); - verify(mWifiMetrics).addWifiLockActiveSession(eq(WifiManager.WIFI_MODE_FULL_HIGH_PERF), - eq(new int[]{DEFAULT_TEST_UID_1}), eq(new String[]{null}), anyLong(), anyBoolean(), + verify(mWifiMetrics).addWifiLockManagerActiveSession( + eq(WifiManager.WIFI_MODE_FULL_HIGH_PERF), eq(new int[]{DEFAULT_TEST_UID_1}), + eq(new String[]{null}), anyLong(), anyBoolean(), anyBoolean(), anyBoolean()); assertEquals(WifiManager.WIFI_MODE_NO_LOCKS_HELD, mWifiLockManager.getStrongestLockMode()); inOrder.verify(mClientModeManager).setPowerSave(ClientMode.POWER_SAVE_CLIENT_WIFI_LOCK, true); - verify(mWifiMetrics).addWifiLockActiveSession(eq(WifiManager.WIFI_MODE_FULL_HIGH_PERF), - eq(new int[]{DEFAULT_TEST_UID_1}), eq(new String[]{null}), anyLong(), anyBoolean(), + verify(mWifiMetrics).addWifiLockManagerActiveSession( + eq(WifiManager.WIFI_MODE_FULL_HIGH_PERF), eq(new int[]{DEFAULT_TEST_UID_1}), + eq(new String[]{null}), anyLong(), anyBoolean(), anyBoolean(), anyBoolean()); } @@ -791,7 +793,7 @@ public class WifiLockManagerTest extends WifiBaseTest { mLooper.dispatchAll(); inOrder.verify(mClientModeManager).setPowerSave(ClientMode.POWER_SAVE_CLIENT_WIFI_LOCK, true); - verify(mWifiMetrics, never()).addWifiLockActiveSession( + verify(mWifiMetrics, never()).addWifiLockManagerActiveSession( eq(expectedMode), eq(new int[]{DEFAULT_TEST_UID_1}), eq(new String[]{null}), anyLong(), anyBoolean(), anyBoolean(), anyBoolean()); @@ -804,7 +806,7 @@ public class WifiLockManagerTest extends WifiBaseTest { mWifiLockManager.getStrongestLockMode()); inOrder.verify(mClientModeManager).setPowerSave(ClientMode.POWER_SAVE_CLIENT_WIFI_LOCK, true); - verify(mWifiMetrics).addWifiLockActiveSession(eq(expectedMode), + verify(mWifiMetrics).addWifiLockManagerActiveSession(eq(expectedMode), eq(new int[]{DEFAULT_TEST_UID_1}), eq(new String[]{null}), anyLong(), anyBoolean(), anyBoolean(), anyBoolean()); } @@ -833,9 +835,9 @@ public class WifiLockManagerTest extends WifiBaseTest { mWifiLockManager.getStrongestLockMode()); inOrder.verify(mClientModeManager).setPowerSave(ClientMode.POWER_SAVE_CLIENT_WIFI_LOCK, true); - verify(mWifiMetrics).addWifiLockActiveSession(eq(WifiManager.WIFI_MODE_FULL_HIGH_PERF), - eq(new int[0]), eq(new String[0]), anyLong(), anyBoolean(), - anyBoolean(), anyBoolean()); + verify(mWifiMetrics).addWifiLockManagerActiveSession( + eq(WifiManager.WIFI_MODE_FULL_HIGH_PERF), eq(new int[0]), eq(new String[0]), + anyLong(), anyBoolean(), anyBoolean(), anyBoolean()); } /** @@ -876,8 +878,9 @@ public class WifiLockManagerTest extends WifiBaseTest { mWifiLockManager.getStrongestLockMode()); inOrder.verify(mClientModeManager).setPowerSave(ClientMode.POWER_SAVE_CLIENT_WIFI_LOCK, true); - verify(mWifiMetrics).addWifiLockActiveSession(eq(WifiManager.WIFI_MODE_FULL_HIGH_PERF), - eq(new int[]{DEFAULT_TEST_UID_1}), eq(new String[]{null}), anyLong(), anyBoolean(), + verify(mWifiMetrics).addWifiLockManagerActiveSession( + eq(WifiManager.WIFI_MODE_FULL_HIGH_PERF), eq(new int[]{DEFAULT_TEST_UID_1}), + eq(new String[]{null}), anyLong(), anyBoolean(), anyBoolean(), anyBoolean()); } @@ -1101,8 +1104,9 @@ public class WifiLockManagerTest extends WifiBaseTest { inOrder.verify(mClientModeManager).setLowLatencyMode(false); inOrder.verify(mClientModeManager).setPowerSave(ClientMode.POWER_SAVE_CLIENT_WIFI_LOCK, true); - verify(mWifiMetrics).addWifiLockActiveSession(eq(WifiManager.WIFI_MODE_FULL_LOW_LATENCY), - eq(new int[]{DEFAULT_TEST_UID_1}), eq(new String[]{null}), anyLong(), anyBoolean(), + verify(mWifiMetrics).addWifiLockManagerActiveSession( + eq(WifiManager.WIFI_MODE_FULL_LOW_LATENCY), eq(new int[]{DEFAULT_TEST_UID_1}), + eq(new String[]{null}), anyLong(), anyBoolean(), anyBoolean(), anyBoolean()); } @@ -1201,8 +1205,9 @@ public class WifiLockManagerTest extends WifiBaseTest { inOrder.verify(mClientModeManager).setLowLatencyMode(false); inOrder.verify(mClientModeManager).setPowerSave(ClientMode.POWER_SAVE_CLIENT_WIFI_LOCK, true); - verify(mWifiMetrics).addWifiLockActiveSession(eq(WifiManager.WIFI_MODE_FULL_LOW_LATENCY), - eq(new int[]{DEFAULT_TEST_UID_1}), eq(new String[]{null}), anyLong(), anyBoolean(), + verify(mWifiMetrics).addWifiLockManagerActiveSession( + eq(WifiManager.WIFI_MODE_FULL_LOW_LATENCY), eq(new int[]{DEFAULT_TEST_UID_1}), + eq(new String[]{null}), anyLong(), anyBoolean(), anyBoolean(), anyBoolean()); } @@ -1245,8 +1250,9 @@ public class WifiLockManagerTest extends WifiBaseTest { inOrder.verify(mClientModeManager).setLowLatencyMode(false); inOrder.verify(mClientModeManager).setPowerSave(ClientMode.POWER_SAVE_CLIENT_WIFI_LOCK, true); - verify(mWifiMetrics).addWifiLockActiveSession(eq(WifiManager.WIFI_MODE_FULL_LOW_LATENCY), - eq(new int[]{DEFAULT_TEST_UID_1}), eq(new String[]{null}), anyLong(), anyBoolean(), + verify(mWifiMetrics).addWifiLockManagerActiveSession( + eq(WifiManager.WIFI_MODE_FULL_LOW_LATENCY), eq(new int[]{DEFAULT_TEST_UID_1}), + eq(new String[]{null}), anyLong(), anyBoolean(), anyBoolean(), anyBoolean()); } @@ -1335,8 +1341,9 @@ public class WifiLockManagerTest extends WifiBaseTest { inOrder.verify(mClientModeManager).setPowerSave(ClientMode.POWER_SAVE_CLIENT_WIFI_LOCK, true); - verify(mWifiMetrics).addWifiLockActiveSession(eq(WifiManager.WIFI_MODE_FULL_HIGH_PERF), - eq(new int[]{DEFAULT_TEST_UID_1}), eq(new String[]{null}), anyLong(), anyBoolean(), + verify(mWifiMetrics).addWifiLockManagerActiveSession( + eq(WifiManager.WIFI_MODE_FULL_HIGH_PERF), eq(new int[]{DEFAULT_TEST_UID_1}), + eq(new String[]{null}), anyLong(), anyBoolean(), anyBoolean(), anyBoolean()); inOrder.verify(mClientModeManager).setLowLatencyMode(true); inOrder.verify(mClientModeManager).setPowerSave(ClientMode.POWER_SAVE_CLIENT_WIFI_LOCK, @@ -1375,9 +1382,9 @@ public class WifiLockManagerTest extends WifiBaseTest { inOrder.verify(mClientModeManager).setLowLatencyMode(false); inOrder.verify(mClientModeManager).setPowerSave(ClientMode.POWER_SAVE_CLIENT_WIFI_LOCK, true); - verify(mWifiMetrics).addWifiLockActiveSession(eq(WifiManager.WIFI_MODE_FULL_LOW_LATENCY), - eq(new int[0]), eq(new String[0]), anyLong(), anyBoolean(), - anyBoolean(), anyBoolean()); + verify(mWifiMetrics).addWifiLockManagerActiveSession( + eq(WifiManager.WIFI_MODE_FULL_LOW_LATENCY), eq(new int[0]), eq(new String[0]), + anyLong(), anyBoolean(), anyBoolean(), anyBoolean()); } /** @@ -1463,8 +1470,9 @@ public class WifiLockManagerTest extends WifiBaseTest { inOrder.verify(mClientModeManager).setLowLatencyMode(false); inOrder.verify(mClientModeManager).setPowerSave(ClientMode.POWER_SAVE_CLIENT_WIFI_LOCK, true); - verify(mWifiMetrics).addWifiLockActiveSession(eq(WifiManager.WIFI_MODE_FULL_LOW_LATENCY), - eq(new int[]{DEFAULT_TEST_UID_1}), eq(new String[]{null}), anyLong(), anyBoolean(), + verify(mWifiMetrics).addWifiLockManagerActiveSession( + eq(WifiManager.WIFI_MODE_FULL_LOW_LATENCY), eq(new int[]{DEFAULT_TEST_UID_1}), + eq(new String[]{null}), anyLong(), anyBoolean(), anyBoolean(), anyBoolean()); } @@ -1522,9 +1530,9 @@ public class WifiLockManagerTest extends WifiBaseTest { inOrder.verify(mClientModeManager).setPowerSave(ClientMode.POWER_SAVE_CLIENT_WIFI_LOCK, true); - verify(mWifiMetrics).addWifiLockActiveSession(eq(WifiManager.WIFI_MODE_FULL_HIGH_PERF), - eq(new int[0]), eq(new String[0]), anyLong(), anyBoolean(), anyBoolean(), - anyBoolean()); + verify(mWifiMetrics).addWifiLockManagerActiveSession( + eq(WifiManager.WIFI_MODE_FULL_HIGH_PERF), eq(new int[0]), eq(new String[0]), + anyLong(), anyBoolean(), anyBoolean(), anyBoolean()); inOrder.verify(mClientModeManager).setLowLatencyMode(true); inOrder.verify(mClientModeManager).setPowerSave(ClientMode.POWER_SAVE_CLIENT_WIFI_LOCK, false); @@ -1557,9 +1565,9 @@ public class WifiLockManagerTest extends WifiBaseTest { inOrder.verify(mClientModeManager).setLowLatencyMode(false); inOrder.verify(mClientModeManager).setPowerSave(ClientMode.POWER_SAVE_CLIENT_WIFI_LOCK, true); - verify(mWifiMetrics).addWifiLockActiveSession(eq(WifiManager.WIFI_MODE_FULL_LOW_LATENCY), - eq(new int[0]), eq(new String[0]), anyLong(), anyBoolean(), anyBoolean(), - anyBoolean()); + verify(mWifiMetrics).addWifiLockManagerActiveSession( + eq(WifiManager.WIFI_MODE_FULL_LOW_LATENCY), eq(new int[0]), eq(new String[0]), + anyLong(), anyBoolean(), anyBoolean(), anyBoolean()); inOrder.verify(mClientModeManager).setPowerSave(ClientMode.POWER_SAVE_CLIENT_WIFI_LOCK, false); } @@ -1748,8 +1756,8 @@ public class WifiLockManagerTest extends WifiBaseTest { when(mClock.getElapsedSinceBootMillis()).thenReturn(deactivationTime); mWifiLockManager.updateWifiClientConnected(mClientModeManager, false); - verify(mWifiMetrics).addWifiLockActiveSession(eq(expectedMode), - eq(new int[]{DEFAULT_TEST_UID_1}), eq(new String[]{null}), + verify(mWifiMetrics).addWifiLockManagerActiveSession( + eq(expectedMode), eq(new int[]{DEFAULT_TEST_UID_1}), eq(new String[]{null}), eq(deactivationTime - activationTime), eq(true), eq(false), eq(false)); @@ -1800,7 +1808,8 @@ public class WifiLockManagerTest extends WifiBaseTest { when(mClock.getElapsedSinceBootMillis()).thenReturn(deactivationTime); mWifiLockManager.updateWifiClientConnected(mClientModeManager, false); - verify(mWifiMetrics).addWifiLockActiveSession(eq(WifiManager.WIFI_MODE_FULL_LOW_LATENCY), + verify(mWifiMetrics).addWifiLockManagerActiveSession( + eq(WifiManager.WIFI_MODE_FULL_LOW_LATENCY), eq(new int[]{DEFAULT_TEST_UID_1}), eq(new String[]{null}), eq(deactivationTime - activationTime), eq(true), eq(false), eq(false)); diff --git a/service/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java b/service/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java index e16c2b1272..1e9c381554 100644 --- a/service/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java +++ b/service/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java @@ -5530,7 +5530,7 @@ public class WifiMetricsTest extends WifiBaseTest { */ @Test public void testWifiLockActiveSession() throws Exception { - mWifiMetrics.addWifiLockActiveSession(WifiManager.WIFI_MODE_FULL_HIGH_PERF, + mWifiMetrics.addWifiLockManagerActiveSession(WifiManager.WIFI_MODE_FULL_HIGH_PERF, new int[]{TEST_UID}, new String[]{TEST_TAG}, 100000, true, false, false); ExtendedMockito.verify( () -> WifiStatsLog.write(WifiStatsLog.WIFI_LOCK_DEACTIVATED, new int[]{TEST_UID}, @@ -5538,7 +5538,7 @@ public class WifiMetricsTest extends WifiBaseTest { WifiStatsLog.WIFI_LOCK_DEACTIVATED__MODE__WIFI_MODE_FULL_HIGH_PERF, 100000, true, false, false)); - mWifiMetrics.addWifiLockActiveSession(WifiManager.WIFI_MODE_FULL_HIGH_PERF, + mWifiMetrics.addWifiLockManagerActiveSession(WifiManager.WIFI_MODE_FULL_HIGH_PERF, new int[]{TEST_UID}, new String[]{TEST_TAG}, 10000, true, true, false); ExtendedMockito.verify( () -> WifiStatsLog.write(WifiStatsLog.WIFI_LOCK_DEACTIVATED, new int[]{TEST_UID}, @@ -5546,7 +5546,7 @@ public class WifiMetricsTest extends WifiBaseTest { WifiStatsLog.WIFI_LOCK_DEACTIVATED__MODE__WIFI_MODE_FULL_HIGH_PERF, 10000, true, true, false)); - mWifiMetrics.addWifiLockActiveSession(WifiManager.WIFI_MODE_FULL_HIGH_PERF, + mWifiMetrics.addWifiLockManagerActiveSession(WifiManager.WIFI_MODE_FULL_HIGH_PERF, new int[]{TEST_UID}, new String[]{TEST_TAG}, 10000000, true, true, true); ExtendedMockito.verify( () -> WifiStatsLog.write(WifiStatsLog.WIFI_LOCK_DEACTIVATED, new int[]{TEST_UID}, @@ -5554,7 +5554,7 @@ public class WifiMetricsTest extends WifiBaseTest { WifiStatsLog.WIFI_LOCK_DEACTIVATED__MODE__WIFI_MODE_FULL_HIGH_PERF, 10000000, true, true, true)); - mWifiMetrics.addWifiLockActiveSession(WifiManager.WIFI_MODE_FULL_HIGH_PERF, + mWifiMetrics.addWifiLockManagerActiveSession(WifiManager.WIFI_MODE_FULL_HIGH_PERF, new int[]{TEST_UID}, new String[]{TEST_TAG}, 1000, false, false, false); ExtendedMockito.verify( () -> WifiStatsLog.write(WifiStatsLog.WIFI_LOCK_DEACTIVATED, new int[]{TEST_UID}, @@ -5562,7 +5562,7 @@ public class WifiMetricsTest extends WifiBaseTest { WifiStatsLog.WIFI_LOCK_DEACTIVATED__MODE__WIFI_MODE_FULL_HIGH_PERF, 1000, false, false, false)); - mWifiMetrics.addWifiLockActiveSession(WifiManager.WIFI_MODE_FULL_LOW_LATENCY, + mWifiMetrics.addWifiLockManagerActiveSession(WifiManager.WIFI_MODE_FULL_LOW_LATENCY, new int[]{TEST_UID}, new String[]{TEST_TAG}, 90000, false, false, false); ExtendedMockito.verify( () -> WifiStatsLog.write(WifiStatsLog.WIFI_LOCK_DEACTIVATED, new int[]{TEST_UID}, @@ -5570,7 +5570,7 @@ public class WifiMetricsTest extends WifiBaseTest { WifiStatsLog.WIFI_LOCK_DEACTIVATED__MODE__WIFI_MODE_FULL_LOW_LATENCY, 90000, false, false, false)); - mWifiMetrics.addWifiLockActiveSession(WifiManager.WIFI_MODE_FULL_LOW_LATENCY, + mWifiMetrics.addWifiLockManagerActiveSession(WifiManager.WIFI_MODE_FULL_LOW_LATENCY, new int[]{TEST_UID}, new String[]{TEST_TAG}, 900000, true, false, false); ExtendedMockito.verify( () -> WifiStatsLog.write(WifiStatsLog.WIFI_LOCK_DEACTIVATED, new int[]{TEST_UID}, @@ -5578,7 +5578,7 @@ public class WifiMetricsTest extends WifiBaseTest { WifiStatsLog.WIFI_LOCK_DEACTIVATED__MODE__WIFI_MODE_FULL_LOW_LATENCY, 900000, true, false, false)); - mWifiMetrics.addWifiLockActiveSession(WifiManager.WIFI_MODE_FULL_LOW_LATENCY, + mWifiMetrics.addWifiLockManagerActiveSession(WifiManager.WIFI_MODE_FULL_LOW_LATENCY, new int[]{TEST_UID}, new String[]{TEST_TAG}, 9000, true, true, false); ExtendedMockito.verify( () -> WifiStatsLog.write(WifiStatsLog.WIFI_LOCK_DEACTIVATED, new int[]{TEST_UID}, @@ -5586,7 +5586,7 @@ public class WifiMetricsTest extends WifiBaseTest { WifiStatsLog.WIFI_LOCK_DEACTIVATED__MODE__WIFI_MODE_FULL_LOW_LATENCY, 9000, true, true, false)); - mWifiMetrics.addWifiLockActiveSession(WifiManager.WIFI_MODE_FULL_LOW_LATENCY, + mWifiMetrics.addWifiLockManagerActiveSession(WifiManager.WIFI_MODE_FULL_LOW_LATENCY, new int[]{TEST_UID}, new String[]{TEST_TAG}, 20000000, true, true, true); ExtendedMockito.verify( () -> WifiStatsLog.write(WifiStatsLog.WIFI_LOCK_DEACTIVATED, new int[]{TEST_UID}, -- cgit v1.2.3-59-g8ed1b From 8729cd99ddb429aeb79fcff6671ae84e028d71d9 Mon Sep 17 00:00:00 2001 From: Gabriel Biren Date: Fri, 21 Mar 2025 00:16:10 +0000 Subject: Log WifiMulticastLockManager active sessions in WifiMetrics when filtering is re-enabled. Bug: 391378901 Flag: EXEMPT minor metrics feature Test: atest WifiMulticastLockManagerTest Change-Id: Ie79a3d67bdab271c8d2aba3be20fb60b2b7f2077 --- .../server/wifi/WifiMulticastLockManager.java | 31 +++++++--- .../server/wifi/WifiMulticastLockManagerTest.java | 66 ++++++++++++++++++++++ 2 files changed, 88 insertions(+), 9 deletions(-) diff --git a/service/java/com/android/server/wifi/WifiMulticastLockManager.java b/service/java/com/android/server/wifi/WifiMulticastLockManager.java index f02efc3d74..598bf5716d 100644 --- a/service/java/com/android/server/wifi/WifiMulticastLockManager.java +++ b/service/java/com/android/server/wifi/WifiMulticastLockManager.java @@ -50,6 +50,8 @@ public class WifiMulticastLockManager { private final Map mNumLocksPerInactiveOwner = new HashMap<>(); private int mMulticastEnabled = 0; private int mMulticastDisabled = 0; + private boolean mIsFilterDisableSessionActive = false; + private long mFilterDisableSessionStartTime; private final Handler mHandler; private final Object mLock = new Object(); private boolean mVerboseLoggingEnabled = false; @@ -235,17 +237,32 @@ public class WifiMulticastLockManager { public void startFilteringMulticastPackets() { synchronized (mLock) { if (!isMulticastEnabled()) { + if (mIsFilterDisableSessionActive) { + // Log the end of the filtering disabled session, + // since we're about to re-enable multicast packet filtering + mWifiMetrics.addMulticastLockManagerActiveSession( + mClock.getElapsedSinceBootMillis() - mFilterDisableSessionStartTime); + } mActiveModeWarden.getPrimaryClientModeManager() .getMcastLockManagerFilterController() .startFilteringMulticastPackets(); + mIsFilterDisableSessionActive = false; } } } private void stopFilteringMulticastPackets() { - mActiveModeWarden.getPrimaryClientModeManager() - .getMcastLockManagerFilterController() - .stopFilteringMulticastPackets(); + synchronized (mLock) { + if (!mIsFilterDisableSessionActive) { + // Mark the beginning of a filtering disabled session, + // since we're about to disable multicast packet filtering + mFilterDisableSessionStartTime = mClock.getElapsedSinceBootMillis(); + } + mActiveModeWarden.getPrimaryClientModeManager() + .getMcastLockManagerFilterController() + .stopFilteringMulticastPackets(); + mIsFilterDisableSessionActive = true; + } } /** @@ -273,9 +290,7 @@ public class WifiMulticastLockManager { // our new size == 1 (first call), but this function won't // be called often and by making the stopPacket call each // time we're less fragile and self-healing. - mActiveModeWarden.getPrimaryClientModeManager() - .getMcastLockManagerFilterController() - .stopFilteringMulticastPackets(); + stopFilteringMulticastPackets(); } final long ident = Binder.clearCallingIdentity(); @@ -328,9 +343,7 @@ public class WifiMulticastLockManager { } if (!isMulticastEnabled()) { - mActiveModeWarden.getPrimaryClientModeManager() - .getMcastLockManagerFilterController() - .startFilteringMulticastPackets(); + startFilteringMulticastPackets(); } final long ident = Binder.clearCallingIdentity(); diff --git a/service/tests/wifitests/src/com/android/server/wifi/WifiMulticastLockManagerTest.java b/service/tests/wifitests/src/com/android/server/wifi/WifiMulticastLockManagerTest.java index eb290241b1..8ce4a8d191 100644 --- a/service/tests/wifitests/src/com/android/server/wifi/WifiMulticastLockManagerTest.java +++ b/service/tests/wifitests/src/com/android/server/wifi/WifiMulticastLockManagerTest.java @@ -406,4 +406,70 @@ public class WifiMulticastLockManagerTest extends WifiBaseTest { verify(mWifiMetrics).addMulticastLockManagerAcqSession( eq(TEST_UID), eq(TEST_ATTRIBUTION_TAG), anyInt(), eq(10L) /* duration */); } + + /** + * Verify that an active session is logged when multicast filtering is re-enabled, + * and that an acquire session is logged when a multicast lock is released. + */ + @Test + public void testSingleLockActiveSessionMetrics() { + IBinder binder = mock(IBinder.class); + when(mClock.getElapsedSinceBootMillis()).thenReturn(START_TIME); + mManager.acquireLock(TEST_UID, binder, WL_1_TAG, TEST_ATTRIBUTION_TAG, TEST_PACKAGE_NAME); + + // Transition the UID to low importance at t=10 + // Since this is the only lock, this should re-enable packet filtering + when(mClock.getElapsedSinceBootMillis()).thenReturn(START_TIME + 10); + mUidImportanceListenerCaptor.getValue().onUidImportance( + TEST_UID, ActivityManager.RunningAppProcessInfo.IMPORTANCE_CACHED); + mLooper.dispatchAll(); + + // Release the lock at t=20 + when(mClock.getElapsedSinceBootMillis()).thenReturn(START_TIME + 20); + mManager.releaseLock(TEST_UID, binder, WL_1_TAG); + + // Verify that the active session was logged during the priority switch (t=10) + // and that the lock acquire session was logged during the lock release (t=20) + verify(mWifiMetrics).addMulticastLockManagerActiveSession(eq(10L)); + verify(mWifiMetrics).addMulticastLockManagerAcqSession( + eq(TEST_UID), eq(TEST_ATTRIBUTION_TAG), anyInt(), eq(20L)); + } + + /** + * See comment for {@link #testSingleLockActiveSessionMetrics()}. + * This case considers a multi-lock scenario. + */ + @Test + public void testMultiLockActiveSessionMetrics() { + int uid1 = TEST_UID; + int uid2 = TEST_UID + 1; + String attributionTag1 = "attribution-tag-1"; + String attributionTag2 = "attribution-tag-2"; + String packageName1 = "package-name-1"; + String packageName2 = "package-name-2"; + IBinder binder1 = mock(IBinder.class); + IBinder binder2 = mock(IBinder.class); + + when(mClock.getElapsedSinceBootMillis()).thenReturn(START_TIME); + mManager.acquireLock(uid1, binder1, WL_1_TAG, attributionTag1, packageName1); + mManager.acquireLock(uid2, binder2, WL_2_TAG, attributionTag2, packageName2); + + // Release lock 1 at t=10. Multicast filtering is still disabled. + when(mClock.getElapsedSinceBootMillis()).thenReturn(START_TIME + 10); + mManager.releaseLock(uid1, binder1, WL_1_TAG); + + // Release lock 2 at t=20. Multicast filtering should be re-enabled. + when(mClock.getElapsedSinceBootMillis()).thenReturn(START_TIME + 20); + mManager.releaseLock(uid2, binder2, WL_2_TAG); + + // An acquire session should have been logged when each lock was released + verify(mWifiMetrics).addMulticastLockManagerAcqSession( + eq(uid1), eq(attributionTag1), anyInt(), eq(10L)); + verify(mWifiMetrics).addMulticastLockManagerAcqSession( + eq(uid2), eq(attributionTag2), anyInt(), eq(20L)); + + // A single active session should have been logged when the final lock was released (t=20) + verify(mWifiMetrics, times(1)).addMulticastLockManagerActiveSession(anyLong()); + verify(mWifiMetrics).addMulticastLockManagerActiveSession(eq(20L)); + } } -- cgit v1.2.3-59-g8ed1b