Loading services/core/java/com/android/server/ConnectivityService.java +33 −19 Original line number Diff line number Diff line Loading @@ -832,6 +832,19 @@ public class ConnectivityService extends IConnectivityManager.Stub } }; private Network[] getVpnUnderlyingNetworks(int uid) { if (!mLockdownEnabled) { int user = UserHandle.getUserId(uid); synchronized (mVpns) { Vpn vpn = mVpns.get(user); if (vpn != null && vpn.appliesToUid(uid)) { return vpn.getUnderlyingNetworks(); } } } return null; } private NetworkState getUnfilteredActiveNetworkState(int uid) { NetworkInfo info = null; LinkProperties lp = null; Loading @@ -841,27 +854,19 @@ public class ConnectivityService extends IConnectivityManager.Stub NetworkAgentInfo nai = mNetworkForRequestId.get(mDefaultRequest.requestId); if (!mLockdownEnabled) { int user = UserHandle.getUserId(uid); synchronized (mVpns) { Vpn vpn = mVpns.get(user); if (vpn != null && vpn.appliesToUid(uid)) { final Network[] networks = getVpnUnderlyingNetworks(uid); if (networks != null) { // getUnderlyingNetworks() returns: // null => the VPN didn't specify anything, so we use the default. // null => there was no VPN, or the VPN didn't specify anything, so we use the default. // empty array => the VPN explicitly said "no default network". // non-empty array => the VPN specified one or more default networks; we use the // first one. Network[] networks = vpn.getUnderlyingNetworks(); if (networks != null) { if (networks.length > 0) { nai = getNetworkAgentInfoForNetwork(networks[0]); } else { nai = null; } } } } } if (nai != null) { synchronized (nai) { Loading Loading @@ -990,6 +995,15 @@ public class ConnectivityService extends IConnectivityManager.Stub public NetworkInfo getNetworkInfo(int networkType) { enforceAccessPermission(); final int uid = Binder.getCallingUid(); if (getVpnUnderlyingNetworks(uid) != null) { // A VPN is active, so we may need to return one of its underlying networks. This // information is not available in LegacyTypeTracker, so we have to get it from // getUnfilteredActiveNetworkState. NetworkState state = getUnfilteredActiveNetworkState(uid); if (state.networkInfo != null && state.networkInfo.getType() == networkType) { return getFilteredNetworkInfo(state.networkInfo, state.linkProperties, uid); } } NetworkState state = getFilteredNetworkState(networkType, uid); return state.networkInfo; } Loading Loading
services/core/java/com/android/server/ConnectivityService.java +33 −19 Original line number Diff line number Diff line Loading @@ -832,6 +832,19 @@ public class ConnectivityService extends IConnectivityManager.Stub } }; private Network[] getVpnUnderlyingNetworks(int uid) { if (!mLockdownEnabled) { int user = UserHandle.getUserId(uid); synchronized (mVpns) { Vpn vpn = mVpns.get(user); if (vpn != null && vpn.appliesToUid(uid)) { return vpn.getUnderlyingNetworks(); } } } return null; } private NetworkState getUnfilteredActiveNetworkState(int uid) { NetworkInfo info = null; LinkProperties lp = null; Loading @@ -841,27 +854,19 @@ public class ConnectivityService extends IConnectivityManager.Stub NetworkAgentInfo nai = mNetworkForRequestId.get(mDefaultRequest.requestId); if (!mLockdownEnabled) { int user = UserHandle.getUserId(uid); synchronized (mVpns) { Vpn vpn = mVpns.get(user); if (vpn != null && vpn.appliesToUid(uid)) { final Network[] networks = getVpnUnderlyingNetworks(uid); if (networks != null) { // getUnderlyingNetworks() returns: // null => the VPN didn't specify anything, so we use the default. // null => there was no VPN, or the VPN didn't specify anything, so we use the default. // empty array => the VPN explicitly said "no default network". // non-empty array => the VPN specified one or more default networks; we use the // first one. Network[] networks = vpn.getUnderlyingNetworks(); if (networks != null) { if (networks.length > 0) { nai = getNetworkAgentInfoForNetwork(networks[0]); } else { nai = null; } } } } } if (nai != null) { synchronized (nai) { Loading Loading @@ -990,6 +995,15 @@ public class ConnectivityService extends IConnectivityManager.Stub public NetworkInfo getNetworkInfo(int networkType) { enforceAccessPermission(); final int uid = Binder.getCallingUid(); if (getVpnUnderlyingNetworks(uid) != null) { // A VPN is active, so we may need to return one of its underlying networks. This // information is not available in LegacyTypeTracker, so we have to get it from // getUnfilteredActiveNetworkState. NetworkState state = getUnfilteredActiveNetworkState(uid); if (state.networkInfo != null && state.networkInfo.getType() == networkType) { return getFilteredNetworkInfo(state.networkInfo, state.linkProperties, uid); } } NetworkState state = getFilteredNetworkState(networkType, uid); return state.networkInfo; } Loading