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

Commit f9cd7f9a 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 am: 9754eccd

parents 1b685938 9754eccd
Loading
Loading
Loading
Loading
+11 −0
Original line number Original line Diff line number Diff line
@@ -18,6 +18,8 @@ package com.android.server.vcn;


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


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


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

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


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


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

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


    @VisibleForTesting(visibility = Visibility.PRIVATE)
    @VisibleForTesting(visibility = Visibility.PRIVATE)
    void setSafeModeAlarm() {
    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);
        logVdbg("Setting safe mode alarm; mCurrentToken: " + mCurrentToken);


        // Only schedule a NEW alarm if none is already set.
        // Only schedule a NEW alarm if none is already set.
+10 −0
Original line number Original line Diff line number Diff line
@@ -117,6 +117,16 @@ public class VcnGatewayConnectionConfigTest {
        return buildTestConfig(UNDERLYING_NETWORK_TEMPLATES);
        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() {
    private static VcnGatewayConnectionConfig.Builder newBuilder() {
        // Append a unique identifier to the name prefix to guarantee that all created
        // Append a unique identifier to the name prefix to guarantee that all created
        // VcnGatewayConnectionConfigs have a unique name (required by VcnConfig).
        // VcnGatewayConnectionConfigs have a unique name (required by VcnConfig).
+71 −0
Original line number Original line Diff line number Diff line
@@ -75,6 +75,9 @@ import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
import androidx.test.runner.AndroidJUnit4;


import com.android.server.vcn.VcnGatewayConnection.VcnChildSessionCallback;
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.routeselection.UnderlyingNetworkRecord;
import com.android.server.vcn.util.MtuUtils;
import com.android.server.vcn.util.MtuUtils;


@@ -651,6 +654,74 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection
        verifySafeModeStateAndCallbackFired(2 /* invocationCount */, true /* isInSafeMode */);
        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() {
    private Consumer<VcnNetworkAgent> setupNetworkAndGetUnwantedCallback() {
        triggerChildOpened();
        triggerChildOpened();
        mTestLooper.dispatchAll();
        mTestLooper.dispatchAll();
+12 −1
Original line number Original line 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.IkeSessionCallback;
import android.net.ipsec.ike.IkeSessionConfiguration;
import android.net.ipsec.ike.IkeSessionConfiguration;
import android.net.ipsec.ike.IkeSessionConnectionInfo;
import android.net.ipsec.ike.IkeSessionConnectionInfo;
import android.net.vcn.FeatureFlags;
import android.net.vcn.VcnGatewayConnectionConfig;
import android.net.vcn.VcnGatewayConnectionConfig;
import android.net.vcn.VcnGatewayConnectionConfigTest;
import android.net.vcn.VcnGatewayConnectionConfigTest;
import android.os.ParcelUuid;
import android.os.ParcelUuid;
@@ -165,6 +166,7 @@ public class VcnGatewayConnectionTestBase {
    @NonNull protected final Context mContext;
    @NonNull protected final Context mContext;
    @NonNull protected final TestLooper mTestLooper;
    @NonNull protected final TestLooper mTestLooper;
    @NonNull protected final VcnNetworkProvider mVcnNetworkProvider;
    @NonNull protected final VcnNetworkProvider mVcnNetworkProvider;
    @NonNull protected final FeatureFlags mFeatureFlags;
    @NonNull protected final VcnContext mVcnContext;
    @NonNull protected final VcnContext mVcnContext;
    @NonNull protected final VcnGatewayConnectionConfig mConfig;
    @NonNull protected final VcnGatewayConnectionConfig mConfig;
    @NonNull protected final VcnGatewayStatusCallback mGatewayStatusCallback;
    @NonNull protected final VcnGatewayStatusCallback mGatewayStatusCallback;
@@ -190,6 +192,7 @@ public class VcnGatewayConnectionTestBase {
        mContext = mock(Context.class);
        mContext = mock(Context.class);
        mTestLooper = new TestLooper();
        mTestLooper = new TestLooper();
        mVcnNetworkProvider = mock(VcnNetworkProvider.class);
        mVcnNetworkProvider = mock(VcnNetworkProvider.class);
        mFeatureFlags = mock(FeatureFlags.class);
        mVcnContext = mock(VcnContext.class);
        mVcnContext = mock(VcnContext.class);
        mConfig = VcnGatewayConnectionConfigTest.buildTestConfig();
        mConfig = VcnGatewayConnectionConfigTest.buildTestConfig();
        mGatewayStatusCallback = mock(VcnGatewayStatusCallback.class);
        mGatewayStatusCallback = mock(VcnGatewayStatusCallback.class);
@@ -222,6 +225,7 @@ public class VcnGatewayConnectionTestBase {
        doReturn(mContext).when(mVcnContext).getContext();
        doReturn(mContext).when(mVcnContext).getContext();
        doReturn(mTestLooper.getLooper()).when(mVcnContext).getLooper();
        doReturn(mTestLooper.getLooper()).when(mVcnContext).getLooper();
        doReturn(mVcnNetworkProvider).when(mVcnContext).getVcnNetworkProvider();
        doReturn(mVcnNetworkProvider).when(mVcnContext).getVcnNetworkProvider();
        doReturn(mFeatureFlags).when(mVcnContext).getFeatureFlags();


        doReturn(mUnderlyingNetworkController)
        doReturn(mUnderlyingNetworkController)
                .when(mDeps)
                .when(mDeps)
@@ -241,8 +245,15 @@ public class VcnGatewayConnectionTestBase {
        doReturn(ELAPSED_REAL_TIME).when(mDeps).getElapsedRealTime();
        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) {
    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
    @Before