diff --git a/Vcn/service-b/src/com/android/server/vcn/VcnGatewayConnection.java b/Vcn/service-b/src/com/android/server/vcn/VcnGatewayConnection.java index da411174f9..42c887512d 100644 --- a/Vcn/service-b/src/com/android/server/vcn/VcnGatewayConnection.java +++ b/Vcn/service-b/src/com/android/server/vcn/VcnGatewayConnection.java @@ -106,6 +106,7 @@ import com.android.internal.util.WakeupMessage; import com.android.modules.utils.HandlerExecutor; import com.android.server.vcn.TelephonySubscriptionTracker.TelephonySubscriptionSnapshot; import com.android.server.vcn.Vcn.VcnGatewayStatusCallback; +import com.android.server.vcn.metrics.VcnMetrics; import com.android.server.vcn.routeselection.UnderlyingNetworkController; import com.android.server.vcn.routeselection.UnderlyingNetworkController.UnderlyingNetworkControllerCallback; import com.android.server.vcn.routeselection.UnderlyingNetworkRecord; @@ -626,6 +627,7 @@ public class VcnGatewayConnection extends StateMachine { @NonNull private final UnderlyingNetworkController mUnderlyingNetworkController; @NonNull private final VcnGatewayConnectionConfig mConnectionConfig; @NonNull private final VcnGatewayStatusCallback mGatewayStatusCallback; + @NonNull private final VcnMetrics mVcnMetrics; @NonNull private final Dependencies mDeps; @NonNull @@ -634,6 +636,7 @@ public class VcnGatewayConnection extends StateMachine { @NonNull private final VcnConnectivityDiagnosticsCallback mConnectivityDiagnosticsCallback; private final boolean mIsMobileDataEnabled; + private final int mId = System.identityHashCode(this); @NonNull private final IpSecManager mIpSecManager; @NonNull private final ConnectivityManager mConnectivityManager; @@ -787,6 +790,7 @@ public class VcnGatewayConnection extends StateMachine { Objects.requireNonNull(gatewayStatusCallback, "Missing gatewayStatusCallback"); mIsMobileDataEnabled = isMobileDataEnabled; mDeps = Objects.requireNonNull(deps, "Missing deps"); + mVcnMetrics = mDeps.newVcnMetrics(); mLastSnapshot = Objects.requireNonNull(snapshot, "Missing snapshot"); @@ -1522,6 +1526,9 @@ public class VcnGatewayConnection extends StateMachine { // Connectivity for this GatewayConnection is broken; tear down the Network. teardownNetwork(); + if (!mIsInSafeMode) { + mVcnMetrics.logEnterSafeMode(mId); + } mIsInSafeMode = true; mGatewayStatusCallback.onSafeModeStatusChanged(); } @@ -1893,6 +1900,9 @@ public class VcnGatewayConnection extends StateMachine { mFailedAttempts = 0; cancelSafeModeAlarm(); + if (mIsInSafeMode) { + mVcnMetrics.logExitSafeMode(mId); + } mIsInSafeMode = false; mGatewayStatusCallback.onSafeModeStatusChanged(); } @@ -2514,8 +2524,7 @@ public class VcnGatewayConnection extends StateMachine { + LogUtils.getHashedSubscriptionGroup(mSubscriptionGroup) + "-" + mConnectionConfig.getGatewayConnectionName() - + "-" - + System.identityHashCode(this) + + "-" + mId + ") "; } @@ -2743,6 +2752,11 @@ public class VcnGatewayConnection extends StateMachine { /** External dependencies used by VcnGatewayConnection, for injection in tests */ @VisibleForTesting(visibility = Visibility.PRIVATE) public static class Dependencies { + /** Builds a new VcnMetrics. */ + public VcnMetrics newVcnMetrics() { + return new VcnMetrics(); + } + /** Builds a new UnderlyingNetworkController. */ public UnderlyingNetworkController newUnderlyingNetworkController( VcnContext vcnContext, diff --git a/Vcn/tests/unit/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java b/Vcn/tests/unit/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java index bf0c46c60f..64fcaff862 100644 --- a/Vcn/tests/unit/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java +++ b/Vcn/tests/unit/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java @@ -626,6 +626,7 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection verifySafeModeStateAndCallbackFired(2 /* invocationCount */, false /* isInSafeMode */); assertFalse(mGatewayConnection.isInSafeMode()); + verify(mVcnMetrics).logExitSafeMode(anyInt()); } @Test @@ -654,6 +655,7 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection mTestLooper.dispatchAll(); verifySafeModeStateAndCallbackFired(2 /* invocationCount */, true /* isInSafeMode */); + verify(mVcnMetrics).logEnterSafeMode(anyInt()); } private void verifySetSafeModeAlarm( diff --git a/Vcn/tests/unit/java/com/android/server/vcn/VcnGatewayConnectionTestBase.java b/Vcn/tests/unit/java/com/android/server/vcn/VcnGatewayConnectionTestBase.java index 7f0cabf7d1..461fa9cd9c 100644 --- a/Vcn/tests/unit/java/com/android/server/vcn/VcnGatewayConnectionTestBase.java +++ b/Vcn/tests/unit/java/com/android/server/vcn/VcnGatewayConnectionTestBase.java @@ -70,6 +70,7 @@ import com.android.server.vcn.VcnGatewayConnection.VcnChildSessionCallback; import com.android.server.vcn.VcnGatewayConnection.VcnIkeSession; import com.android.server.vcn.VcnGatewayConnection.VcnNetworkAgent; import com.android.server.vcn.VcnGatewayConnection.VcnWakeLock; +import com.android.server.vcn.metrics.VcnMetrics; import com.android.server.vcn.routeselection.UnderlyingNetworkController; import com.android.server.vcn.routeselection.UnderlyingNetworkRecord; @@ -173,6 +174,7 @@ public class VcnGatewayConnectionTestBase { @NonNull protected final WakeupMessage mDisconnectRequestAlarm; @NonNull protected final WakeupMessage mRetryTimeoutAlarm; @NonNull protected final WakeupMessage mSafeModeTimeoutAlarm; + @NonNull protected final VcnMetrics mVcnMetrics; @NonNull protected final IpSecService mIpSecSvc; @NonNull protected final ConnectivityManager mConnMgr; @@ -199,6 +201,7 @@ public class VcnGatewayConnectionTestBase { mDisconnectRequestAlarm = mock(WakeupMessage.class); mRetryTimeoutAlarm = mock(WakeupMessage.class); mSafeModeTimeoutAlarm = mock(WakeupMessage.class); + mVcnMetrics = mock(VcnMetrics.class); mIpSecSvc = mock(IpSecService.class); setupIpSecManager(mContext, mIpSecSvc); @@ -226,6 +229,7 @@ public class VcnGatewayConnectionTestBase { doReturn(mUnderlyingNetworkController) .when(mDeps) .newUnderlyingNetworkController(any(), any(), any(), any(), any()); + doReturn(mVcnMetrics).when(mDeps).newVcnMetrics(); doReturn(mWakeLock) .when(mDeps) .newWakeLock(eq(mContext), eq(PowerManager.PARTIAL_WAKE_LOCK), any());