diff options
author | Lorenzo Colitti <lorenzo@google.com> | 2015-02-11 07:33:10 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2015-02-11 07:33:10 +0000 |
commit | e1507ac506a4dac327a5cbabede0384836659de0 (patch) | |
tree | 958470288f0b922f9d1f414a52684b65a66d83c8 | |
parent | c54a87e302a2a28b16864f71b9db57241d68ca48 (diff) | |
parent | 00c8450d2711de57ee45f66cae1050dbca98d1f5 (diff) | |
download | frameworks_base-e1507ac506a4dac327a5cbabede0384836659de0.zip frameworks_base-e1507ac506a4dac327a5cbabede0384836659de0.tar.gz frameworks_base-e1507ac506a4dac327a5cbabede0384836659de0.tar.bz2 |
am 00c8450d: Merge "Make getNetworkInfo() take into account VPN underlying networks." into lmp-mr1-dev automerge: c38b90b
* 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 944f1c0..551a5dc 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; } |