am ac0bc4ad: Merge "Make getNetworkInfo() take into account VPN underlying networks." into lmp-mr1-dev automerge: c38b90b automerge: 00c8450

* commit 'ac0bc4ad5f53a659928666fc9accec7bddf173e8':
  Make getNetworkInfo() take into account VPN underlying networks.
This commit is contained in:
Lorenzo Colitti
2015-02-11 07:40:08 +00:00
committed by Android Git Automerger

View File

@@ -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;
}