Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9754eccd authored by Yan Yan's avatar Yan Yan Committed by Automerger Merge Worker
Browse files

Merge "Respect caller config to disable VCN safe mode" into main am: ace49e05

parents 98a755a3 ace49e05
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@ package com.android.server.vcn;

import android.annotation.NonNull;
import android.content.Context;
import android.net.vcn.FeatureFlags;
import android.net.vcn.FeatureFlagsImpl;
import android.os.Looper;

import java.util.Objects;
@@ -31,6 +33,7 @@ public class VcnContext {
    @NonNull private final Context mContext;
    @NonNull private final Looper mLooper;
    @NonNull private final VcnNetworkProvider mVcnNetworkProvider;
    @NonNull private final FeatureFlags mFeatureFlags;
    private final boolean mIsInTestMode;

    public VcnContext(
@@ -42,6 +45,9 @@ public class VcnContext {
        mLooper = Objects.requireNonNull(looper, "Missing looper");
        mVcnNetworkProvider = Objects.requireNonNull(vcnNetworkProvider, "Missing networkProvider");
        mIsInTestMode = isInTestMode;

        // Auto-generated class
        mFeatureFlags = new FeatureFlagsImpl();
    }

    @NonNull
@@ -63,6 +69,11 @@ public class VcnContext {
        return mIsInTestMode;
    }

    @NonNull
    public FeatureFlags getFeatureFlags() {
        return mFeatureFlags;
    }

    /**
     * Verifies that the caller is running on the VcnContext Thread.
     *
+8 −0
Original line number Diff line number Diff line
@@ -1222,6 +1222,14 @@ public class VcnGatewayConnection extends StateMachine {

    @VisibleForTesting(visibility = Visibility.PRIVATE)
    void setSafeModeAlarm() {
        final boolean isFlagSafeModeConfigEnabled = mVcnContext.getFeatureFlags().safeModeConfig();
        logVdbg("isFlagSafeModeConfigEnabled " + isFlagSafeModeConfigEnabled);

        if (isFlagSafeModeConfigEnabled && !mConnectionConfig.isSafeModeEnabled()) {
            logVdbg("setSafeModeAlarm: safe mode disabled");
            return;
        }

        logVdbg("Setting safe mode alarm; mCurrentToken: " + mCurrentToken);

        // Only schedule a NEW alarm if none is already set.
+10 −0
Original line number Diff line number Diff line
@@ -117,6 +117,16 @@ public class VcnGatewayConnectionConfigTest {
        return buildTestConfig(UNDERLYING_NETWORK_TEMPLATES);
    }

    // Public for use in VcnGatewayConnectionTest
    public static VcnGatewayConnectionConfig.Builder newTestBuilderMinimal() {
        final VcnGatewayConnectionConfig.Builder builder = newBuilder();
        for (int caps : EXPOSED_CAPS) {
            builder.addExposedCapability(caps);
        }

        return builder;
    }

    private static VcnGatewayConnectionConfig.Builder newBuilder() {
        // Append a unique identifier to the name prefix to guarantee that all created
        // VcnGatewayConnectionConfigs have a unique name (required by VcnConfig).
+71 −0
Original line number Diff line number Diff line
@@ -75,6 +75,9 @@ import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;

import com.android.server.vcn.VcnGatewayConnection.VcnChildSessionCallback;
import com.android.server.vcn.VcnGatewayConnection.VcnChildSessionConfiguration;
import com.android.server.vcn.VcnGatewayConnection.VcnIkeSession;
import com.android.server.vcn.VcnGatewayConnection.VcnNetworkAgent;
import com.android.server.vcn.routeselection.UnderlyingNetworkRecord;
import com.android.server.vcn.util.MtuUtils;

@@ -651,6 +654,74 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection
        verifySafeModeStateAndCallbackFired(2 /* invocationCount */, true /* isInSafeMode */);
    }

    private void verifySetSafeModeAlarm(
            boolean safeModeEnabledByCaller,
            boolean safeModeConfigFlagEnabled,
            boolean expectingSafeModeEnabled)
            throws Exception {
        final VcnGatewayConnectionConfig config =
                VcnGatewayConnectionConfigTest.newTestBuilderMinimal()
                        .enableSafeMode(safeModeEnabledByCaller)
                        .build();
        final VcnGatewayConnection.Dependencies deps =
                mock(VcnGatewayConnection.Dependencies.class);
        setUpWakeupMessage(
                mSafeModeTimeoutAlarm, VcnGatewayConnection.SAFEMODE_TIMEOUT_ALARM, deps);
        doReturn(safeModeConfigFlagEnabled).when(mFeatureFlags).safeModeConfig();

        final VcnGatewayConnection connection =
                new VcnGatewayConnection(
                        mVcnContext,
                        TEST_SUB_GRP,
                        TEST_SUBSCRIPTION_SNAPSHOT,
                        config,
                        mGatewayStatusCallback,
                        true /* isMobileDataEnabled */,
                        deps);

        connection.setSafeModeAlarm();

        final int expectedCallCnt = expectingSafeModeEnabled ? 1 : 0;
        verify(deps, times(expectedCallCnt))
                .newWakeupMessage(
                        eq(mVcnContext),
                        any(),
                        eq(VcnGatewayConnection.SAFEMODE_TIMEOUT_ALARM),
                        any());
    }

    @Test
    public void testSafeModeEnabled_configFlagEnabled() throws Exception {
        verifySetSafeModeAlarm(
                true /* safeModeEnabledByCaller */,
                true /* safeModeConfigFlagEnabled */,
                true /* expectingSafeModeEnabled */);
    }

    @Test
    public void testSafeModeEnabled_configFlagDisabled() throws Exception {
        verifySetSafeModeAlarm(
                true /* safeModeEnabledByCaller */,
                false /* safeModeConfigFlagEnabled */,
                true /* expectingSafeModeEnabled */);
    }

    @Test
    public void testSafeModeDisabled_configFlagEnabled() throws Exception {
        verifySetSafeModeAlarm(
                false /* safeModeEnabledByCaller */,
                true /* safeModeConfigFlagEnabled */,
                false /* expectingSafeModeEnabled */);
    }

    @Test
    public void testSafeModeDisabled_configFlagDisabled() throws Exception {
        verifySetSafeModeAlarm(
                false /* safeModeEnabledByCaller */,
                false /* safeModeConfigFlagEnabled */,
                true /* expectingSafeModeEnabled */);
    }

    private Consumer<VcnNetworkAgent> setupNetworkAndGetUnwantedCallback() {
        triggerChildOpened();
        mTestLooper.dispatchAll();
+12 −1
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ import android.net.ipsec.ike.ChildSessionCallback;
import android.net.ipsec.ike.IkeSessionCallback;
import android.net.ipsec.ike.IkeSessionConfiguration;
import android.net.ipsec.ike.IkeSessionConnectionInfo;
import android.net.vcn.FeatureFlags;
import android.net.vcn.VcnGatewayConnectionConfig;
import android.net.vcn.VcnGatewayConnectionConfigTest;
import android.os.ParcelUuid;
@@ -165,6 +166,7 @@ public class VcnGatewayConnectionTestBase {
    @NonNull protected final Context mContext;
    @NonNull protected final TestLooper mTestLooper;
    @NonNull protected final VcnNetworkProvider mVcnNetworkProvider;
    @NonNull protected final FeatureFlags mFeatureFlags;
    @NonNull protected final VcnContext mVcnContext;
    @NonNull protected final VcnGatewayConnectionConfig mConfig;
    @NonNull protected final VcnGatewayStatusCallback mGatewayStatusCallback;
@@ -190,6 +192,7 @@ public class VcnGatewayConnectionTestBase {
        mContext = mock(Context.class);
        mTestLooper = new TestLooper();
        mVcnNetworkProvider = mock(VcnNetworkProvider.class);
        mFeatureFlags = mock(FeatureFlags.class);
        mVcnContext = mock(VcnContext.class);
        mConfig = VcnGatewayConnectionConfigTest.buildTestConfig();
        mGatewayStatusCallback = mock(VcnGatewayStatusCallback.class);
@@ -222,6 +225,7 @@ public class VcnGatewayConnectionTestBase {
        doReturn(mContext).when(mVcnContext).getContext();
        doReturn(mTestLooper.getLooper()).when(mVcnContext).getLooper();
        doReturn(mVcnNetworkProvider).when(mVcnContext).getVcnNetworkProvider();
        doReturn(mFeatureFlags).when(mVcnContext).getFeatureFlags();

        doReturn(mUnderlyingNetworkController)
                .when(mDeps)
@@ -241,8 +245,15 @@ public class VcnGatewayConnectionTestBase {
        doReturn(ELAPSED_REAL_TIME).when(mDeps).getElapsedRealTime();
    }

    protected void setUpWakeupMessage(
            @NonNull WakeupMessage msg,
            @NonNull String cmdName,
            VcnGatewayConnection.Dependencies deps) {
        doReturn(msg).when(deps).newWakeupMessage(eq(mVcnContext), any(), eq(cmdName), any());
    }

    private void setUpWakeupMessage(@NonNull WakeupMessage msg, @NonNull String cmdName) {
        doReturn(msg).when(mDeps).newWakeupMessage(eq(mVcnContext), any(), eq(cmdName), any());
        setUpWakeupMessage(msg, cmdName, mDeps);
    }

    @Before