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

Commit e69fbba6 authored by Benedict Wong's avatar Benedict Wong Committed by Automerger Merge Worker
Browse files

Merge "Automatically set IPsec tunnel interface as up" am: 7df882e0 am:...

Merge "Automatically set IPsec tunnel interface as up" am: 7df882e0 am: 8c9064e8 am: 9110937f am: 484ea00b

Change-Id: I612485082674501bfaa95e285a0594c64c32805f
parents e94cb60d 484ea00b
Loading
Loading
Loading
Loading
+19 −7
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ import android.net.TrafficStats;
import android.net.util.NetdService;
import android.os.Binder;
import android.os.IBinder;
import android.os.INetworkManagementService;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.os.ServiceSpecificException;
@@ -114,6 +115,9 @@ public class IpSecService extends IIpSecService.Stub {
    /* Binder context for this service */
    private final Context mContext;

    /* NetworkManager instance */
    private final INetworkManagementService mNetworkManager;

    /**
     * The next non-repeating global ID for tracking resources between users, this service, and
     * kernel data structures. Accessing this variable is not thread safe, so it is only read or
@@ -992,12 +996,13 @@ public class IpSecService extends IIpSecService.Stub {
     *
     * @param context Binder context for this service
     */
    private IpSecService(Context context) {
        this(context, IpSecServiceConfiguration.GETSRVINSTANCE);
    private IpSecService(Context context, INetworkManagementService networkManager) {
        this(context, networkManager, IpSecServiceConfiguration.GETSRVINSTANCE);
    }

    static IpSecService create(Context context) throws InterruptedException {
        final IpSecService service = new IpSecService(context);
    static IpSecService create(Context context, INetworkManagementService networkManager)
            throws InterruptedException {
        final IpSecService service = new IpSecService(context, networkManager);
        service.connectNativeNetdService();
        return service;
    }
@@ -1011,9 +1016,11 @@ public class IpSecService extends IIpSecService.Stub {

    /** @hide */
    @VisibleForTesting
    public IpSecService(Context context, IpSecServiceConfiguration config) {
    public IpSecService(Context context, INetworkManagementService networkManager,
            IpSecServiceConfiguration config) {
        this(
                context,
                networkManager,
                config,
                (fd, uid) -> {
                    try {
@@ -1027,9 +1034,10 @@ public class IpSecService extends IIpSecService.Stub {

    /** @hide */
    @VisibleForTesting
    public IpSecService(
            Context context, IpSecServiceConfiguration config, UidFdTagger uidFdTagger) {
    public IpSecService(Context context, INetworkManagementService networkManager,
            IpSecServiceConfiguration config, UidFdTagger uidFdTagger) {
        mContext = context;
        mNetworkManager = Objects.requireNonNull(networkManager);
        mSrvConfig = config;
        mUidFdTagger = uidFdTagger;
    }
@@ -1308,6 +1316,10 @@ public class IpSecService extends IIpSecService.Stub {
            final INetd netd = mSrvConfig.getNetdInstance();
            netd.ipSecAddTunnelInterface(intfName, localAddr, remoteAddr, ikey, okey, resourceId);

            Binder.withCleanCallingIdentity(() -> {
                mNetworkManager.setInterfaceUp(intfName);
            });

            for (int selAddrFamily : ADDRESS_FAMILIES) {
                // Always send down correct local/remote addresses for template.
                netd.ipSecAddSecurityPolicy(
+1 −1
Original line number Diff line number Diff line
@@ -1407,7 +1407,7 @@ public final class SystemServer {

            t.traceBegin("StartIpSecService");
            try {
                ipSecService = IpSecService.create(context);
                ipSecService = IpSecService.create(context, networkManagement);
                ServiceManager.addService(Context.IPSEC_SERVICE, ipSecService);
            } catch (Throwable e) {
                reportWtf("starting IpSec Service", e);
+5 −1
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ import android.net.LinkAddress;
import android.net.Network;
import android.net.NetworkUtils;
import android.os.Binder;
import android.os.INetworkManagementService;
import android.os.ParcelFileDescriptor;
import android.system.Os;
import android.test.mock.MockContext;
@@ -135,6 +136,7 @@ public class IpSecServiceParameterizedTest {
    };

    INetd mMockNetd;
    INetworkManagementService mNetworkManager;
    PackageManager mMockPkgMgr;
    IpSecService.IpSecServiceConfiguration mMockIpSecSrvConfig;
    IpSecService mIpSecService;
@@ -160,9 +162,10 @@ public class IpSecServiceParameterizedTest {
    @Before
    public void setUp() throws Exception {
        mMockNetd = mock(INetd.class);
        mNetworkManager = mock(INetworkManagementService.class);
        mMockPkgMgr = mock(PackageManager.class);
        mMockIpSecSrvConfig = mock(IpSecService.IpSecServiceConfiguration.class);
        mIpSecService = new IpSecService(mMockContext, mMockIpSecSrvConfig);
        mIpSecService = new IpSecService(mMockContext, mNetworkManager, mMockIpSecSrvConfig);

        // Injecting mock netd
        when(mMockIpSecSrvConfig.getNetdInstance()).thenReturn(mMockNetd);
@@ -609,6 +612,7 @@ public class IpSecServiceParameterizedTest {
                        anyInt(),
                        anyInt(),
                        anyInt());
        verify(mNetworkManager).setInterfaceUp(createTunnelResp.interfaceName);
    }

    @Test
+3 −1
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import static org.mockito.Mockito.verify;
import android.content.Context;
import android.os.Binder;
import android.os.IBinder;
import android.os.INetworkManagementService;
import android.os.RemoteException;

import androidx.test.filters.SmallTest;
@@ -61,7 +62,8 @@ public class IpSecServiceRefcountedResourceTest {
    public void setUp() throws Exception {
        mMockContext = mock(Context.class);
        mMockIpSecSrvConfig = mock(IpSecService.IpSecServiceConfiguration.class);
        mIpSecService = new IpSecService(mMockContext, mMockIpSecSrvConfig);
        mIpSecService = new IpSecService(
                mMockContext, mock(INetworkManagementService.class), mMockIpSecSrvConfig);
    }

    private void assertResourceState(
+7 −4
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ import android.net.IpSecManager;
import android.net.IpSecSpiResponse;
import android.net.IpSecUdpEncapResponse;
import android.os.Binder;
import android.os.INetworkManagementService;
import android.os.ParcelFileDescriptor;
import android.os.Process;
import android.system.ErrnoException;
@@ -115,6 +116,7 @@ public class IpSecServiceTest {
    }

    Context mMockContext;
    INetworkManagementService mMockNetworkManager;
    INetd mMockNetd;
    IpSecService.IpSecServiceConfiguration mMockIpSecSrvConfig;
    IpSecService mIpSecService;
@@ -122,9 +124,10 @@ public class IpSecServiceTest {
    @Before
    public void setUp() throws Exception {
        mMockContext = mock(Context.class);
        mMockNetworkManager = mock(INetworkManagementService.class);
        mMockNetd = mock(INetd.class);
        mMockIpSecSrvConfig = mock(IpSecService.IpSecServiceConfiguration.class);
        mIpSecService = new IpSecService(mMockContext, mMockIpSecSrvConfig);
        mIpSecService = new IpSecService(mMockContext, mMockNetworkManager, mMockIpSecSrvConfig);

        // Injecting mock netd
        when(mMockIpSecSrvConfig.getNetdInstance()).thenReturn(mMockNetd);
@@ -132,7 +135,7 @@ public class IpSecServiceTest {

    @Test
    public void testIpSecServiceCreate() throws InterruptedException {
        IpSecService ipSecSrv = IpSecService.create(mMockContext);
        IpSecService ipSecSrv = IpSecService.create(mMockContext, mMockNetworkManager);
        assertNotNull(ipSecSrv);
    }

@@ -604,8 +607,8 @@ public class IpSecServiceTest {
    @Test
    public void testOpenUdpEncapSocketTagsSocket() throws Exception {
        IpSecService.UidFdTagger mockTagger = mock(IpSecService.UidFdTagger.class);
        IpSecService testIpSecService =
                new IpSecService(mMockContext, mMockIpSecSrvConfig, mockTagger);
        IpSecService testIpSecService = new IpSecService(
                mMockContext, mMockNetworkManager, mMockIpSecSrvConfig, mockTagger);

        IpSecUdpEncapResponse udpEncapResp =
                testIpSecService.openUdpEncapsulationSocket(0, new Binder());