Fix: VPNs update caps upon underlying network disconnect.
Bug: 79748782 Test: ConnectivityServiceTests still pass Change-Id: Ic8231b18a17e6feb5ebafe8d5688fb59f9d4d58e
This commit is contained in:
@@ -2503,6 +2503,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
ensureNetworkTransitionWakelock(nai.name());
|
||||
}
|
||||
mLegacyTypeTracker.remove(nai, wasDefault);
|
||||
if (!nai.networkCapabilities.hasTransport(TRANSPORT_VPN)) {
|
||||
updateAllVpnsCapabilities();
|
||||
}
|
||||
rematchAllNetworksAndRequests(null, 0);
|
||||
mLingerMonitor.noteDisconnect(nai);
|
||||
if (nai.created) {
|
||||
@@ -3778,6 +3781,26 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Ask all VPN objects to recompute and update their capabilities.
|
||||
*
|
||||
* When underlying networks change, VPNs may have to update capabilities to reflect things
|
||||
* like the metered bit, their transports, and so on. This asks the VPN objects to update
|
||||
* their capabilities, and as this will cause them to send messages to the ConnectivityService
|
||||
* handler thread through their agent, this is asynchronous. When the capabilities objects
|
||||
* are computed they will be up-to-date as they are computed synchronously from here and
|
||||
* this is running on the ConnectivityService thread.
|
||||
* TODO : Fix this and call updateCapabilities inline to remove out-of-order events.
|
||||
*/
|
||||
private void updateAllVpnsCapabilities() {
|
||||
synchronized (mVpns) {
|
||||
for (int i = 0; i < mVpns.size(); i++) {
|
||||
final Vpn vpn = mVpns.valueAt(i);
|
||||
vpn.updateCapabilities();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean updateLockdownVpn() {
|
||||
if (Binder.getCallingUid() != Process.SYSTEM_UID) {
|
||||
@@ -4935,12 +4958,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
if (!newNc.hasTransport(TRANSPORT_VPN)) {
|
||||
// Tell VPNs about updated capabilities, since they may need to
|
||||
// bubble those changes through.
|
||||
synchronized (mVpns) {
|
||||
for (int i = 0; i < mVpns.size(); i++) {
|
||||
final Vpn vpn = mVpns.valueAt(i);
|
||||
vpn.updateCapabilities();
|
||||
}
|
||||
}
|
||||
updateAllVpnsCapabilities();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4405,7 +4405,6 @@ public class ConnectivityServiceTest {
|
||||
&& !caps.hasCapability(NET_CAPABILITY_NOT_METERED),
|
||||
vpnNetworkAgent);
|
||||
|
||||
if (false) { // TODO : reactivate this ; in the current state, the below fail.
|
||||
// Disconnect cell. Receive update without even removing the dead network from the
|
||||
// underlying networks – it's dead anyway. Not metered any more.
|
||||
mCellNetworkAgent.disconnect();
|
||||
@@ -4422,7 +4421,6 @@ public class ConnectivityServiceTest {
|
||||
&& !caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI)
|
||||
&& caps.hasCapability(NET_CAPABILITY_NOT_METERED),
|
||||
vpnNetworkAgent);
|
||||
}
|
||||
|
||||
mMockVpn.disconnect();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user