Make sure getActiveNetwork is consistent with default callbacks
Almost clean cherry-pick of ag/3889538.
Bug: 77737389
Test: runtest framework-net
new test don't pass without the main code change, but they
do with it
Change-Id: I0cd83a935ab0b349aa47e065b830e5a43ab9a091
Merged-In: Iaa0285825735d3f16bba6e4946723a437fd9b0b9
Merged-In: Ia8f985b448251f911484e6bd63fa562bffc1b0e4
This commit is contained in:
@@ -901,6 +901,15 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
deps);
|
deps);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static NetworkCapabilities createDefaultNetworkCapabilitiesForUid(int uid) {
|
||||||
|
final NetworkCapabilities netCap = new NetworkCapabilities();
|
||||||
|
netCap.addCapability(NET_CAPABILITY_INTERNET);
|
||||||
|
netCap.addCapability(NET_CAPABILITY_NOT_RESTRICTED);
|
||||||
|
netCap.removeCapability(NET_CAPABILITY_NOT_VPN);
|
||||||
|
netCap.setSingleUid(uid);
|
||||||
|
return netCap;
|
||||||
|
}
|
||||||
|
|
||||||
private NetworkRequest createDefaultInternetRequestForTransport(
|
private NetworkRequest createDefaultInternetRequestForTransport(
|
||||||
int transportType, NetworkRequest.Type type) {
|
int transportType, NetworkRequest.Type type) {
|
||||||
NetworkCapabilities netCap = new NetworkCapabilities();
|
NetworkCapabilities netCap = new NetworkCapabilities();
|
||||||
@@ -1153,12 +1162,20 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
int vpnNetId = NETID_UNSET;
|
int vpnNetId = NETID_UNSET;
|
||||||
synchronized (mVpns) {
|
synchronized (mVpns) {
|
||||||
final Vpn vpn = mVpns.get(user);
|
final Vpn vpn = mVpns.get(user);
|
||||||
|
// TODO : now that capabilities contain the UID, the appliesToUid test should
|
||||||
|
// be removed as the satisfying test below should be enough.
|
||||||
if (vpn != null && vpn.appliesToUid(uid)) vpnNetId = vpn.getNetId();
|
if (vpn != null && vpn.appliesToUid(uid)) vpnNetId = vpn.getNetId();
|
||||||
}
|
}
|
||||||
NetworkAgentInfo nai;
|
NetworkAgentInfo nai;
|
||||||
if (vpnNetId != NETID_UNSET) {
|
if (vpnNetId != NETID_UNSET) {
|
||||||
nai = getNetworkAgentInfoForNetId(vpnNetId);
|
nai = getNetworkAgentInfoForNetId(vpnNetId);
|
||||||
if (nai != null) return nai.network;
|
if (nai != null) {
|
||||||
|
final NetworkCapabilities requiredCaps =
|
||||||
|
createDefaultNetworkCapabilitiesForUid(uid);
|
||||||
|
if (requiredCaps.satisfiedByNetworkCapabilities(nai.networkCapabilities)) {
|
||||||
|
return nai.network;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
nai = getDefaultNetwork();
|
nai = getDefaultNetwork();
|
||||||
if (nai != null
|
if (nai != null
|
||||||
@@ -1373,8 +1390,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
private NetworkCapabilities networkCapabilitiesRestrictedForCallerPermissions(
|
private NetworkCapabilities networkCapabilitiesRestrictedForCallerPermissions(
|
||||||
NetworkCapabilities nc, int callerPid, int callerUid) {
|
NetworkCapabilities nc, int callerPid, int callerUid) {
|
||||||
final NetworkCapabilities newNc = new NetworkCapabilities(nc);
|
final NetworkCapabilities newNc = new NetworkCapabilities(nc);
|
||||||
if (!checkSettingsPermission(callerPid, callerUid)) newNc.setUids(null);
|
if (!checkSettingsPermission(callerPid, callerUid)) {
|
||||||
if (!checkSettingsPermission(callerPid, callerUid)) newNc.setSSID(null);
|
newNc.setUids(null);
|
||||||
|
newNc.setSSID(null);
|
||||||
|
}
|
||||||
return newNc;
|
return newNc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4255,8 +4274,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
// the default network request. This allows callers to keep track of
|
// the default network request. This allows callers to keep track of
|
||||||
// the system default network.
|
// the system default network.
|
||||||
if (type == NetworkRequest.Type.TRACK_DEFAULT) {
|
if (type == NetworkRequest.Type.TRACK_DEFAULT) {
|
||||||
networkCapabilities = new NetworkCapabilities(mDefaultRequest.networkCapabilities);
|
networkCapabilities = createDefaultNetworkCapabilitiesForUid(Binder.getCallingUid());
|
||||||
networkCapabilities.removeCapability(NET_CAPABILITY_NOT_VPN);
|
|
||||||
enforceAccessPermission();
|
enforceAccessPermission();
|
||||||
} else {
|
} else {
|
||||||
networkCapabilities = new NetworkCapabilities(networkCapabilities);
|
networkCapabilities = new NetworkCapabilities(networkCapabilities);
|
||||||
@@ -4513,7 +4531,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
|||||||
|
|
||||||
// Note: if mDefaultRequest is changed, NetworkMonitor needs to be updated.
|
// Note: if mDefaultRequest is changed, NetworkMonitor needs to be updated.
|
||||||
private final NetworkRequest mDefaultRequest;
|
private final NetworkRequest mDefaultRequest;
|
||||||
|
|
||||||
// Request used to optionally keep mobile data active even when higher
|
// Request used to optionally keep mobile data active even when higher
|
||||||
// priority networks like Wi-Fi are active.
|
// priority networks like Wi-Fi are active.
|
||||||
private final NetworkRequest mDefaultMobileDataRequest;
|
private final NetworkRequest mDefaultMobileDataRequest;
|
||||||
|
|||||||
@@ -4170,4 +4170,53 @@ public class ConnectivityServiceTest {
|
|||||||
mCm.unregisterNetworkCallback(vpnNetworkCallback);
|
mCm.unregisterNetworkCallback(vpnNetworkCallback);
|
||||||
mCm.unregisterNetworkCallback(defaultCallback);
|
mCm.unregisterNetworkCallback(defaultCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testVpnWithAndWithoutInternet() {
|
||||||
|
final int uid = Process.myUid();
|
||||||
|
|
||||||
|
final TestNetworkCallback defaultCallback = new TestNetworkCallback();
|
||||||
|
mCm.registerDefaultNetworkCallback(defaultCallback);
|
||||||
|
defaultCallback.assertNoCallback();
|
||||||
|
|
||||||
|
mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI);
|
||||||
|
mWiFiNetworkAgent.connect(true);
|
||||||
|
|
||||||
|
defaultCallback.expectAvailableThenValidatedCallbacks(mWiFiNetworkAgent);
|
||||||
|
assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork());
|
||||||
|
|
||||||
|
MockNetworkAgent vpnNetworkAgent = new MockNetworkAgent(TRANSPORT_VPN);
|
||||||
|
final ArraySet<UidRange> ranges = new ArraySet<>();
|
||||||
|
ranges.add(new UidRange(uid, uid));
|
||||||
|
when(mMockVpn.getNetId()).thenReturn(vpnNetworkAgent.getNetwork().netId);
|
||||||
|
vpnNetworkAgent.setUids(ranges);
|
||||||
|
vpnNetworkAgent.connect(true /* validated */, false /* hasInternet */);
|
||||||
|
|
||||||
|
defaultCallback.assertNoCallback();
|
||||||
|
assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork());
|
||||||
|
|
||||||
|
vpnNetworkAgent.disconnect();
|
||||||
|
defaultCallback.assertNoCallback();
|
||||||
|
|
||||||
|
vpnNetworkAgent = new MockNetworkAgent(TRANSPORT_VPN);
|
||||||
|
when(mMockVpn.getNetId()).thenReturn(vpnNetworkAgent.getNetwork().netId);
|
||||||
|
vpnNetworkAgent.setUids(ranges);
|
||||||
|
vpnNetworkAgent.connect(true /* validated */, true /* hasInternet */);
|
||||||
|
defaultCallback.expectAvailableThenValidatedCallbacks(vpnNetworkAgent);
|
||||||
|
assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork());
|
||||||
|
|
||||||
|
vpnNetworkAgent.disconnect();
|
||||||
|
defaultCallback.expectCallback(CallbackState.LOST, vpnNetworkAgent);
|
||||||
|
defaultCallback.expectAvailableCallbacksValidated(mWiFiNetworkAgent);
|
||||||
|
|
||||||
|
vpnNetworkAgent = new MockNetworkAgent(TRANSPORT_VPN);
|
||||||
|
when(mMockVpn.getNetId()).thenReturn(vpnNetworkAgent.getNetwork().netId);
|
||||||
|
ranges.clear();
|
||||||
|
vpnNetworkAgent.setUids(ranges);
|
||||||
|
|
||||||
|
vpnNetworkAgent.connect(false /* validated */, true /* hasInternet */);
|
||||||
|
defaultCallback.assertNoCallback();
|
||||||
|
|
||||||
|
mCm.unregisterNetworkCallback(defaultCallback);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user