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 42c887512d..3b370c1e8a 100644 --- a/Vcn/service-b/src/com/android/server/vcn/VcnGatewayConnection.java +++ b/Vcn/service-b/src/com/android/server/vcn/VcnGatewayConnection.java @@ -1860,10 +1860,13 @@ public class VcnGatewayConnection extends StateMachine { if (mIsQuitting.getValue()) { return; // Ignore; VcnGatewayConnection quitting or already quit } + // TODO(b/443831229): check if mNetworkAgent is stale first. switch (status) { case NetworkAgent.VALIDATION_STATUS_VALID: clearFailedAttemptCounterAndSafeModeAlarm(); + mVcnMetrics.logVcnNetworkValidated( + mId, mNetworkAgent.getIdentityHashCode()); break; case NetworkAgent.VALIDATION_STATUS_NOT_VALID: // Trigger re-validation of underlying networks; if it @@ -1877,6 +1880,8 @@ public class VcnGatewayConnection extends StateMachine { // Will only set a new alarm if no safe mode alarm is // currently scheduled. setSafeModeAlarm(); + mVcnMetrics.logVcnNetworkNotValidated( + mId, mNetworkAgent.getIdentityHashCode()); break; default: logWtf( @@ -2982,6 +2987,7 @@ public class VcnGatewayConnection extends StateMachine { @VisibleForTesting(visibility = Visibility.PRIVATE) public static class VcnNetworkAgent { private final NetworkAgent mImpl; + private final int mId; public VcnNetworkAgent( @NonNull VcnContext vcnContext, @@ -3013,6 +3019,7 @@ public class VcnGatewayConnection extends StateMachine { validationStatusCallback.accept(status); } }; + mId = System.identityHashCode(this); } /** Registers the underlying NetworkAgent */ @@ -3045,6 +3052,11 @@ public class VcnGatewayConnection extends StateMachine { mImpl.setUnderlyingNetworks(underlyingNetworks); } + /** Retrieves the identity hash code of the underlying NetworkAgent */ + public int getIdentityHashCode() { + return mId; + } + /** Retrieves the Network for the underlying NetworkAgent */ @Nullable public Network getNetwork() { 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 64fcaff862..5763969d40 100644 --- a/Vcn/tests/unit/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java +++ b/Vcn/tests/unit/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java @@ -98,6 +98,7 @@ import java.util.function.Consumer; @SmallTest public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnectionTestBase { private static final int PARALLEL_SA_COUNT = 4; + private static final int NETWORK_AGENT_ID = 1234; private VcnIkeSession mIkeSession; private VcnNetworkAgent mNetworkAgent; @@ -114,6 +115,7 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection mVcnNetwork = mock(Network.class); doReturn(mVcnNetwork).when(mNetworkAgent).getNetwork(); + doReturn(NETWORK_AGENT_ID).when(mNetworkAgent).getIdentityHashCode(); mGatewayConnection.setUnderlyingNetwork(TEST_UNDERLYING_NETWORK_RECORD_1); @@ -611,6 +613,26 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection verifyNoMoreInteractions(mIpSecSvc); } + @Test + public void testValidatedTriggered_logsMetrics() throws Exception { + triggerChildOpened(); + mTestLooper.dispatchAll(); + + triggerValidation(NetworkAgent.VALIDATION_STATUS_VALID); + + verify(mVcnMetrics).logVcnNetworkValidated(anyInt(), eq(NETWORK_AGENT_ID)); + } + + @Test + public void testNotValidatedTriggered_logsMetrics() throws Exception { + triggerChildOpened(); + mTestLooper.dispatchAll(); + + triggerValidation(NetworkAgent.VALIDATION_STATUS_NOT_VALID); + + verify(mVcnMetrics).logVcnNetworkNotValidated(anyInt(), eq(NETWORK_AGENT_ID)); + } + @Test public void testSuccessfulConnectionExitsSafeMode() throws Exception { verifySafeModeTimeoutNotifiesCallbackAndUnregistersNetworkAgent(