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

Commit 8dbaacfe authored by Ken Chen's avatar Ken Chen
Browse files

Switch from networkCreate[Physical/Vpn] to networkCreate

networkCreatePhysical and networkCreateVpn are non-extensible. In order
to pass OEM requested VPN type to Netd, we need to migrate to
networkCreate API.

Modify test code accordingly since networkCreatePhysical and
networkCreateVpn have been deprecated on Netd.

Bug: 171872481
Test: atest FrameworksNetTests
atest atest HostsideVpnTests

Change-Id: I50ab8615346c49559c16e815482e7804a1e765c8
parent 06df6d84
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -58,6 +58,7 @@ import java.util.List;
 * @see Ikev2VpnProfile
 */
public class VpnManager {
    // TODO: add a unit test to ensure that TYPE_VPN_xxx matches android.net.NativeVpnType.
    /** Type representing a lack of VPN @hide */
    @SystemApi(client = MODULE_LIBRARIES)
    public static final int TYPE_VPN_NONE = -1;
+25 −16
Original line number Diff line number Diff line
@@ -133,6 +133,8 @@ import android.net.IpMemoryStore;
import android.net.IpPrefix;
import android.net.LinkProperties;
import android.net.MatchAllNetworkSpecifier;
import android.net.NativeNetworkConfig;
import android.net.NativeNetworkType;
import android.net.NattSocketKeepalive;
import android.net.Network;
import android.net.NetworkAgent;
@@ -3804,36 +3806,43 @@ public class ConnectivityService extends IConnectivityManager.Stub
        nai.onNetworkDestroyed();
    }

    private boolean createNativeNetwork(@NonNull NetworkAgentInfo networkAgent) {
    private boolean createNativeNetwork(@NonNull NetworkAgentInfo nai) {
        try {
            // This should never fail.  Specifying an already in use NetID will cause failure.
            if (networkAgent.isVPN()) {
                mNetd.networkCreateVpn(networkAgent.network.getNetId(),
                        (networkAgent.networkAgentConfig == null
                                || !networkAgent.networkAgentConfig.allowBypass));
            } else {
                mNetd.networkCreatePhysical(networkAgent.network.getNetId(),
                        getNetworkPermission(networkAgent.networkCapabilities));
            final NativeNetworkConfig config;
            if (nai.isVPN()) {
                if (getVpnType(nai) == VpnManager.TYPE_VPN_NONE) {
                    Log.wtf(TAG, "Unable to get VPN type from network " + nai.network.getNetId());
                    return false;
                }
            mDnsResolver.createNetworkCache(networkAgent.network.getNetId());
            mDnsManager.updateTransportsForNetwork(networkAgent.network.getNetId(),
                    networkAgent.networkCapabilities.getTransportTypes());
                config = new NativeNetworkConfig(nai.network.getNetId(), NativeNetworkType.VIRTUAL,
                        INetd.PERMISSION_NONE,
                        (nai.networkAgentConfig == null || !nai.networkAgentConfig.allowBypass),
                        getVpnType(nai));
            } else {
                config = new NativeNetworkConfig(nai.network.getNetId(), NativeNetworkType.PHYSICAL,
                        getNetworkPermission(nai.networkCapabilities), /*secure=*/ false,
                        VpnManager.TYPE_VPN_NONE);
            }
            mNetd.networkCreate(config);
            mDnsResolver.createNetworkCache(nai.network.getNetId());
            mDnsManager.updateTransportsForNetwork(nai.network.getNetId(),
                    nai.networkCapabilities.getTransportTypes());
            return true;
        } catch (RemoteException | ServiceSpecificException e) {
            loge("Error creating network " + networkAgent.network.getNetId() + ": "
                    + e.getMessage());
            loge("Error creating network " + nai.network.getNetId() + ": " + e.getMessage());
            return false;
        }
    }

    private void destroyNativeNetwork(@NonNull NetworkAgentInfo networkAgent) {
    private void destroyNativeNetwork(@NonNull NetworkAgentInfo nai) {
        try {
            mNetd.networkDestroy(networkAgent.network.getNetId());
            mNetd.networkDestroy(nai.network.getNetId());
        } catch (RemoteException | ServiceSpecificException e) {
            loge("Exception destroying network(networkDestroy): " + e);
        }
        try {
            mDnsResolver.destroyNetworkCache(networkAgent.network.getNetId());
            mDnsResolver.destroyNetworkCache(nai.network.getNetId());
        } catch (RemoteException | ServiceSpecificException e) {
            loge("Exception destroying network: " + e);
        }
+4 −0
Original line number Diff line number Diff line
@@ -370,4 +370,8 @@ public class NetworkAgentWrapper implements TestableNetworkCallback.HasNetwork {
            }
        }
    }

    public boolean isBypassableVpn() {
        return mNetworkAgentConfig.isBypassableVpn();
    }
}
+35 −19
Original line number Diff line number Diff line
@@ -211,6 +211,8 @@ import android.net.IpSecManager.UdpEncapsulationSocket;
import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.MatchAllNetworkSpecifier;
import android.net.NativeNetworkConfig;
import android.net.NativeNetworkType;
import android.net.Network;
import android.net.NetworkAgent;
import android.net.NetworkAgentConfig;
@@ -1253,6 +1255,8 @@ public class ConnectivityServiceTest {
            verify(mMockNetd, never())
                    .networkRemoveUidRanges(eq(mMockVpn.getNetwork().getNetId()), any());
            mAgentRegistered = true;
            verify(mMockNetd).networkCreate(nativeNetworkConfigVpn(getNetwork().netId,
                    !mMockNetworkAgent.isBypassableVpn(), mVpnType));
            updateState(NetworkInfo.DetailedState.CONNECTED, "registerAgent");
            mNetworkCapabilities.set(mMockNetworkAgent.getNetworkCapabilities());
            mNetworkAgent = mMockNetworkAgent.getNetworkAgent();
@@ -2860,6 +2864,16 @@ public class ConnectivityServiceTest {
        mCm.unregisterNetworkCallback(callback);
    }
    private NativeNetworkConfig nativeNetworkConfigPhysical(int netId, int permission) {
        return new NativeNetworkConfig(netId, NativeNetworkType.PHYSICAL, permission,
                /*secure=*/ false, VpnManager.TYPE_VPN_NONE);
    }
    private NativeNetworkConfig nativeNetworkConfigVpn(int netId, boolean secure, int vpnType) {
        return new NativeNetworkConfig(netId, NativeNetworkType.VIRTUAL, INetd.PERMISSION_NONE,
                secure, vpnType);
    }
    @Test
    public void testNetworkAgentCallbacks() throws Exception {
        // Keeps track of the order of events that happen in this test.
@@ -2881,8 +2895,8 @@ public class ConnectivityServiceTest {
            wifiNetwork.set(mWiFiNetworkAgent.getNetwork());
            assertNotNull(wifiNetwork.get());
            try {
                verify(mMockNetd).networkCreatePhysical(wifiNetwork.get().getNetId(),
                        INetd.PERMISSION_NONE);
                verify(mMockNetd).networkCreate(nativeNetworkConfigPhysical(
                        wifiNetwork.get().getNetId(), INetd.PERMISSION_NONE));
            } catch (RemoteException impossible) {
                fail();
            }
@@ -8327,7 +8341,8 @@ public class ConnectivityServiceTest {
        final int cellNetId = mCellNetworkAgent.getNetwork().netId;
        waitForIdle();
        verify(mMockNetd, times(1)).networkCreatePhysical(eq(cellNetId), anyInt());
        verify(mMockNetd, times(1)).networkCreate(nativeNetworkConfigPhysical(cellNetId,
                INetd.PERMISSION_NONE));
        assertRoutesAdded(cellNetId, ipv6Subnet, defaultRoute);
        verify(mMockDnsResolver, times(1)).createNetworkCache(eq(cellNetId));
        verify(mMockNetd, times(1)).networkAddInterface(cellNetId, MOBILE_IFNAME);
@@ -11982,8 +11997,9 @@ public class ConnectivityServiceTest {
        mSystemDefaultNetworkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent);
        mDefaultNetworkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent);
        mProfileDefaultNetworkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent);
        inOrder.verify(mMockNetd).networkCreatePhysical(mCellNetworkAgent.getNetwork().netId,
                INetd.PERMISSION_NONE);
        inOrder.verify(mMockNetd).networkCreate(nativeNetworkConfigPhysical(
                mCellNetworkAgent.getNetwork().netId, INetd.PERMISSION_NONE));
        final TestOnCompleteListener listener = new TestOnCompleteListener();
        mCm.setProfileNetworkPreference(testHandle, PROFILE_NETWORK_PREFERENCE_ENTERPRISE,
@@ -12010,8 +12026,8 @@ public class ConnectivityServiceTest {
        mProfileDefaultNetworkCallback.expectAvailableCallbacksUnvalidated(workAgent);
        mSystemDefaultNetworkCallback.assertNoCallback();
        mDefaultNetworkCallback.assertNoCallback();
        inOrder.verify(mMockNetd).networkCreatePhysical(workAgent.getNetwork().netId,
                INetd.PERMISSION_SYSTEM);
        inOrder.verify(mMockNetd).networkCreate(
                nativeNetworkConfigPhysical(workAgent.getNetwork().netId, INetd.PERMISSION_SYSTEM));
        inOrder.verify(mMockNetd).networkAddUidRanges(workAgent.getNetwork().netId,
                uidRangeFor(testHandle));
        inOrder.verify(mMockNetd).networkRemoveUidRanges(mCellNetworkAgent.getNetwork().netId,
@@ -12054,8 +12070,8 @@ public class ConnectivityServiceTest {
        mSystemDefaultNetworkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent);
        mDefaultNetworkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent);
        mProfileDefaultNetworkCallback.assertNoCallback();
        inOrder.verify(mMockNetd).networkCreatePhysical(mCellNetworkAgent.getNetwork().netId,
                INetd.PERMISSION_NONE);
        inOrder.verify(mMockNetd).networkCreate(nativeNetworkConfigPhysical(
                mCellNetworkAgent.getNetwork().netId, INetd.PERMISSION_NONE));
        // When the agent disconnects, test that the app on the work profile falls back to the
        // default network.
@@ -12085,8 +12101,8 @@ public class ConnectivityServiceTest {
        mProfileDefaultNetworkCallback.expectAvailableCallbacksUnvalidated(workAgent2);
        assertNoCallbacks(mSystemDefaultNetworkCallback, mDefaultNetworkCallback);
        inOrder.verify(mMockNetd).networkCreatePhysical(workAgent2.getNetwork().netId,
                INetd.PERMISSION_SYSTEM);
        inOrder.verify(mMockNetd).networkCreate(nativeNetworkConfigPhysical(
                workAgent2.getNetwork().netId, INetd.PERMISSION_SYSTEM));
        inOrder.verify(mMockNetd).networkAddUidRanges(workAgent2.getNetwork().netId,
                uidRangeFor(testHandle));
@@ -12131,8 +12147,8 @@ public class ConnectivityServiceTest {
        mCm.setProfileNetworkPreference(testHandle, PROFILE_NETWORK_PREFERENCE_ENTERPRISE,
                r -> r.run(), listener);
        listener.expectOnComplete();
        inOrder.verify(mMockNetd).networkCreatePhysical(mCellNetworkAgent.getNetwork().netId,
                INetd.PERMISSION_NONE);
        inOrder.verify(mMockNetd).networkCreate(nativeNetworkConfigPhysical(
                mCellNetworkAgent.getNetwork().netId, INetd.PERMISSION_NONE));
        inOrder.verify(mMockNetd).networkAddUidRanges(workAgent.getNetwork().netId,
                uidRangeFor(testHandle));
@@ -12184,10 +12200,10 @@ public class ConnectivityServiceTest {
        mDefaultNetworkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent);
        mProfileDefaultNetworkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent);
        app4Cb.expectAvailableThenValidatedCallbacks(mCellNetworkAgent);
        inOrder.verify(mMockNetd).networkCreatePhysical(mCellNetworkAgent.getNetwork().netId,
                INetd.PERMISSION_NONE);
        inOrder.verify(mMockNetd).networkCreatePhysical(workAgent.getNetwork().netId,
                INetd.PERMISSION_SYSTEM);
        inOrder.verify(mMockNetd).networkCreate(nativeNetworkConfigPhysical(
                mCellNetworkAgent.getNetwork().netId, INetd.PERMISSION_NONE));
        inOrder.verify(mMockNetd).networkCreate(nativeNetworkConfigPhysical(
                workAgent.getNetwork().netId, INetd.PERMISSION_SYSTEM));
        final TestOnCompleteListener listener = new TestOnCompleteListener();
        mCm.setProfileNetworkPreference(testHandle2, PROFILE_NETWORK_PREFERENCE_ENTERPRISE,
@@ -12239,8 +12255,8 @@ public class ConnectivityServiceTest {
        mCm.setProfileNetworkPreference(testHandle, PROFILE_NETWORK_PREFERENCE_ENTERPRISE,
                r -> r.run(), listener);
        listener.expectOnComplete();
        inOrder.verify(mMockNetd).networkCreatePhysical(mCellNetworkAgent.getNetwork().netId,
                INetd.PERMISSION_NONE);
        inOrder.verify(mMockNetd).networkCreate(nativeNetworkConfigPhysical(
                mCellNetworkAgent.getNetwork().netId, INetd.PERMISSION_NONE));
        inOrder.verify(mMockNetd).networkAddUidRanges(mCellNetworkAgent.getNetwork().netId,
                uidRangeFor(testHandle));