diff options
| author | 2015-02-11 07:32:53 +0000 | |
|---|---|---|
| committer | 2015-02-11 07:32:53 +0000 | |
| commit | 2d33b31c86ade166b97cbb9085e0185f765932cb (patch) | |
| tree | 02455cddd5e58c2e85a2c78f1d50bd2c12a8cdb6 | |
| parent | ac46e8240470eefbfebb852906a1972ee5faf4db (diff) | |
| parent | 00c8450d2711de57ee45f66cae1050dbca98d1f5 (diff) | |
Merge "Make getNetworkInfo() take into account VPN underlying networks." into lmp-mr1-dev automerge: c38b90b
automerge: 00c8450
* commit '00c8450d2711de57ee45f66cae1050dbca98d1f5':
Make getNetworkInfo() take into account VPN underlying networks.
| -rw-r--r-- | services/core/java/com/android/server/ConnectivityService.java | 52 |
1 files changed, 33 insertions, 19 deletions
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 944f1c0bea23..551a5dc1dcce 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -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; @@ -841,25 +854,17 @@ 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)) { - // getUnderlyingNetworks() returns: - // null => 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; - } - } - } + final Network[] networks = getVpnUnderlyingNetworks(uid); + if (networks != null) { + // getUnderlyingNetworks() returns: + // 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. + if (networks.length > 0) { + nai = getNetworkAgentInfoForNetwork(networks[0]); + } else { + nai = null; } } @@ -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; } |