summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLorenzo Colitti <lorenzo@google.com>2015-02-11 07:33:10 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2015-02-11 07:33:10 +0000
commite1507ac506a4dac327a5cbabede0384836659de0 (patch)
tree958470288f0b922f9d1f414a52684b65a66d83c8
parentc54a87e302a2a28b16864f71b9db57241d68ca48 (diff)
parent00c8450d2711de57ee45f66cae1050dbca98d1f5 (diff)
downloadframeworks_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.java52
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;
}