Log VCN Gateway Connection safe mode transitions.

This change adds logging for when a VcnGatewayConnection enters and
exits safe mode.

Flag: EXEMPT METRICS
Test: atest FrameworksVcnTests, CtsVcnTestCases. go/atomtester
Bug: 288600040
Change-Id: I6423b9fe7a1785fe31b363c8acb0b99f8d5f7df3
This commit is contained in:
Hnin Naing 2025-09-04 12:19:40 -07:00
commit 3a3a2376d5
3 changed files with 22 additions and 2 deletions

View file

@ -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,

View file

@ -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(

View file

@ -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());