Merge "Switch from networkCreate[Physical/Vpn] to networkCreate" am: c9d5cd9fbc

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1669648

Change-Id: Ia7b8d56ee75194cfe289dbb3e73667f43344cda3
This commit is contained in:
Ken Chen
2021-05-13 01:34:23 +00:00
committed by Automerger Merge Worker
4 changed files with 64 additions and 34 deletions

View File

@@ -58,6 +58,7 @@ import java.util.List;
* @see Ikev2VpnProfile * @see Ikev2VpnProfile
*/ */
public class VpnManager { 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 */ /** Type representing a lack of VPN @hide */
@SystemApi(client = MODULE_LIBRARIES) @SystemApi(client = MODULE_LIBRARIES)
public static final int TYPE_VPN_NONE = -1; public static final int TYPE_VPN_NONE = -1;

View File

@@ -133,6 +133,8 @@ import android.net.IpMemoryStore;
import android.net.IpPrefix; import android.net.IpPrefix;
import android.net.LinkProperties; import android.net.LinkProperties;
import android.net.MatchAllNetworkSpecifier; import android.net.MatchAllNetworkSpecifier;
import android.net.NativeNetworkConfig;
import android.net.NativeNetworkType;
import android.net.NattSocketKeepalive; import android.net.NattSocketKeepalive;
import android.net.Network; import android.net.Network;
import android.net.NetworkAgent; import android.net.NetworkAgent;
@@ -3804,36 +3806,43 @@ public class ConnectivityService extends IConnectivityManager.Stub
nai.onNetworkDestroyed(); nai.onNetworkDestroyed();
} }
private boolean createNativeNetwork(@NonNull NetworkAgentInfo networkAgent) { private boolean createNativeNetwork(@NonNull NetworkAgentInfo nai) {
try { try {
// This should never fail. Specifying an already in use NetID will cause failure. // This should never fail. Specifying an already in use NetID will cause failure.
if (networkAgent.isVPN()) { final NativeNetworkConfig config;
mNetd.networkCreateVpn(networkAgent.network.getNetId(), if (nai.isVPN()) {
(networkAgent.networkAgentConfig == null if (getVpnType(nai) == VpnManager.TYPE_VPN_NONE) {
|| !networkAgent.networkAgentConfig.allowBypass)); Log.wtf(TAG, "Unable to get VPN type from network " + nai.network.getNetId());
return false;
}
config = new NativeNetworkConfig(nai.network.getNetId(), NativeNetworkType.VIRTUAL,
INetd.PERMISSION_NONE,
(nai.networkAgentConfig == null || !nai.networkAgentConfig.allowBypass),
getVpnType(nai));
} else { } else {
mNetd.networkCreatePhysical(networkAgent.network.getNetId(), config = new NativeNetworkConfig(nai.network.getNetId(), NativeNetworkType.PHYSICAL,
getNetworkPermission(networkAgent.networkCapabilities)); getNetworkPermission(nai.networkCapabilities), /*secure=*/ false,
VpnManager.TYPE_VPN_NONE);
} }
mDnsResolver.createNetworkCache(networkAgent.network.getNetId()); mNetd.networkCreate(config);
mDnsManager.updateTransportsForNetwork(networkAgent.network.getNetId(), mDnsResolver.createNetworkCache(nai.network.getNetId());
networkAgent.networkCapabilities.getTransportTypes()); mDnsManager.updateTransportsForNetwork(nai.network.getNetId(),
nai.networkCapabilities.getTransportTypes());
return true; return true;
} catch (RemoteException | ServiceSpecificException e) { } catch (RemoteException | ServiceSpecificException e) {
loge("Error creating network " + networkAgent.network.getNetId() + ": " loge("Error creating network " + nai.network.getNetId() + ": " + e.getMessage());
+ e.getMessage());
return false; return false;
} }
} }
private void destroyNativeNetwork(@NonNull NetworkAgentInfo networkAgent) { private void destroyNativeNetwork(@NonNull NetworkAgentInfo nai) {
try { try {
mNetd.networkDestroy(networkAgent.network.getNetId()); mNetd.networkDestroy(nai.network.getNetId());
} catch (RemoteException | ServiceSpecificException e) { } catch (RemoteException | ServiceSpecificException e) {
loge("Exception destroying network(networkDestroy): " + e); loge("Exception destroying network(networkDestroy): " + e);
} }
try { try {
mDnsResolver.destroyNetworkCache(networkAgent.network.getNetId()); mDnsResolver.destroyNetworkCache(nai.network.getNetId());
} catch (RemoteException | ServiceSpecificException e) { } catch (RemoteException | ServiceSpecificException e) {
loge("Exception destroying network: " + e); loge("Exception destroying network: " + e);
} }

View File

@@ -370,4 +370,8 @@ public class NetworkAgentWrapper implements TestableNetworkCallback.HasNetwork {
} }
} }
} }
public boolean isBypassableVpn() {
return mNetworkAgentConfig.isBypassableVpn();
}
} }

View File

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