Merge "Implement ConnectivityManager.reportBadNetwork() to trigger network validation." into lmp-dev
This commit is contained in:
@@ -793,14 +793,28 @@ public class ConnectivityService extends IConnectivityManager.Stub {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if UID should be blocked from using the network represented by the
|
* Check if UID should be blocked from using the network represented by the given networkType.
|
||||||
* given {@link NetworkStateTracker}.
|
* @deprecated Uses mLegacyTypeTracker; cannot deal with multiple Networks of the same type.
|
||||||
*/
|
*/
|
||||||
private boolean isNetworkBlocked(int networkType, int uid) {
|
private boolean isNetworkBlocked(int networkType, int uid) {
|
||||||
|
return isNetworkWithLinkPropertiesBlocked(getLinkPropertiesForType(networkType), uid);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if UID should be blocked from using the network represented by the given
|
||||||
|
* NetworkAgentInfo.
|
||||||
|
*/
|
||||||
|
private boolean isNetworkBlocked(NetworkAgentInfo nai, int uid) {
|
||||||
|
return isNetworkWithLinkPropertiesBlocked(nai.linkProperties, uid);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if UID should be blocked from using the network with the given LinkProperties.
|
||||||
|
*/
|
||||||
|
private boolean isNetworkWithLinkPropertiesBlocked(LinkProperties lp, int uid) {
|
||||||
final boolean networkCostly;
|
final boolean networkCostly;
|
||||||
final int uidRules;
|
final int uidRules;
|
||||||
|
|
||||||
LinkProperties lp = getLinkPropertiesForType(networkType);
|
|
||||||
final String iface = (lp == null ? "" : lp.getInterfaceName());
|
final String iface = (lp == null ? "" : lp.getInterfaceName());
|
||||||
synchronized (mRulesLock) {
|
synchronized (mRulesLock) {
|
||||||
networkCostly = mMeteredIfaces.contains(iface);
|
networkCostly = mMeteredIfaces.contains(iface);
|
||||||
@@ -819,14 +833,33 @@ public class ConnectivityService extends IConnectivityManager.Stub {
|
|||||||
* Return a filtered {@link NetworkInfo}, potentially marked
|
* Return a filtered {@link NetworkInfo}, potentially marked
|
||||||
* {@link DetailedState#BLOCKED} based on
|
* {@link DetailedState#BLOCKED} based on
|
||||||
* {@link #isNetworkBlocked}.
|
* {@link #isNetworkBlocked}.
|
||||||
|
* @deprecated Uses mLegacyTypeTracker; cannot deal with multiple Networks of the same type.
|
||||||
*/
|
*/
|
||||||
private NetworkInfo getFilteredNetworkInfo(int networkType, int uid) {
|
private NetworkInfo getFilteredNetworkInfo(int networkType, int uid) {
|
||||||
NetworkInfo info = getNetworkInfoForType(networkType);
|
NetworkInfo info = getNetworkInfoForType(networkType);
|
||||||
return getFilteredNetworkInfo(info, networkType, uid);
|
return getFilteredNetworkInfo(info, networkType, uid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @deprecated Uses mLegacyTypeTracker; cannot deal with multiple Networks of the same type.
|
||||||
|
*/
|
||||||
private NetworkInfo getFilteredNetworkInfo(NetworkInfo info, int networkType, int uid) {
|
private NetworkInfo getFilteredNetworkInfo(NetworkInfo info, int networkType, int uid) {
|
||||||
if (isNetworkBlocked(networkType, uid)) {
|
if (isNetworkBlocked(networkType, uid)) {
|
||||||
|
// network is blocked; clone and override state
|
||||||
|
info = new NetworkInfo(info);
|
||||||
|
info.setDetailedState(DetailedState.BLOCKED, null, null);
|
||||||
|
if (VDBG) log("returning Blocked NetworkInfo");
|
||||||
|
}
|
||||||
|
if (mLockdownTracker != null) {
|
||||||
|
info = mLockdownTracker.augmentNetworkInfo(info);
|
||||||
|
if (VDBG) log("returning Locked NetworkInfo");
|
||||||
|
}
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
|
||||||
|
private NetworkInfo getFilteredNetworkInfo(NetworkAgentInfo nai, int uid) {
|
||||||
|
NetworkInfo info = nai.networkInfo;
|
||||||
|
if (isNetworkBlocked(nai, uid)) {
|
||||||
// network is blocked; clone and override state
|
// network is blocked; clone and override state
|
||||||
info = new NetworkInfo(info);
|
info = new NetworkInfo(info);
|
||||||
info.setDetailedState(DetailedState.BLOCKED, null, null);
|
info.setDetailedState(DetailedState.BLOCKED, null, null);
|
||||||
@@ -946,7 +979,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
|
|||||||
synchronized (nai) {
|
synchronized (nai) {
|
||||||
if (nai.networkInfo == null) return null;
|
if (nai.networkInfo == null) return null;
|
||||||
|
|
||||||
return getFilteredNetworkInfo(nai.networkInfo, nai.networkInfo.getType(), uid);
|
return getFilteredNetworkInfo(nai, uid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1315,6 +1348,12 @@ public class ConnectivityService extends IConnectivityManager.Stub {
|
|||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void enforceInternetPermission() {
|
||||||
|
mContext.enforceCallingOrSelfPermission(
|
||||||
|
android.Manifest.permission.INTERNET,
|
||||||
|
"ConnectivityService");
|
||||||
|
}
|
||||||
|
|
||||||
private void enforceAccessPermission() {
|
private void enforceAccessPermission() {
|
||||||
mContext.enforceCallingOrSelfPermission(
|
mContext.enforceCallingOrSelfPermission(
|
||||||
android.Manifest.permission.ACCESS_NETWORK_STATE,
|
android.Manifest.permission.ACCESS_NETWORK_STATE,
|
||||||
@@ -2468,7 +2507,22 @@ public class ConnectivityService extends IConnectivityManager.Stub {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void reportBadNetwork(Network network) {
|
public void reportBadNetwork(Network network) {
|
||||||
//TODO
|
enforceAccessPermission();
|
||||||
|
enforceInternetPermission();
|
||||||
|
|
||||||
|
if (network == null) return;
|
||||||
|
|
||||||
|
final int uid = Binder.getCallingUid();
|
||||||
|
NetworkAgentInfo nai = null;
|
||||||
|
synchronized (mNetworkForNetId) {
|
||||||
|
nai = mNetworkForNetId.get(network.netId);
|
||||||
|
}
|
||||||
|
if (nai == null) return;
|
||||||
|
synchronized (nai) {
|
||||||
|
if (isNetworkBlocked(nai, uid)) return;
|
||||||
|
|
||||||
|
nai.networkMonitor.sendMessage(NetworkMonitor.CMD_FORCE_REEVALUATION, uid);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ProxyInfo getProxy() {
|
public ProxyInfo getProxy() {
|
||||||
@@ -4463,6 +4517,8 @@ public class ConnectivityService extends IConnectivityManager.Stub {
|
|||||||
loge("Unknown NetworkAgentInfo in handleConnectionValidated");
|
loge("Unknown NetworkAgentInfo in handleConnectionValidated");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (newNetwork.validated) return;
|
||||||
|
newNetwork.validated = true;
|
||||||
boolean keep = newNetwork.isVPN();
|
boolean keep = newNetwork.isVPN();
|
||||||
boolean isNewDefault = false;
|
boolean isNewDefault = false;
|
||||||
if (DBG) log("handleConnectionValidated for "+newNetwork.name());
|
if (DBG) log("handleConnectionValidated for "+newNetwork.name());
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ public class NetworkAgentInfo {
|
|||||||
public final NetworkMonitor networkMonitor;
|
public final NetworkMonitor networkMonitor;
|
||||||
public final NetworkMisc networkMisc;
|
public final NetworkMisc networkMisc;
|
||||||
public boolean created;
|
public boolean created;
|
||||||
|
public boolean validated;
|
||||||
|
|
||||||
// The list of NetworkRequests being satisfied by this Network.
|
// The list of NetworkRequests being satisfied by this Network.
|
||||||
public final SparseArray<NetworkRequest> networkRequests = new SparseArray<NetworkRequest>();
|
public final SparseArray<NetworkRequest> networkRequests = new SparseArray<NetworkRequest>();
|
||||||
@@ -68,6 +69,7 @@ public class NetworkAgentInfo {
|
|||||||
networkMonitor = new NetworkMonitor(context, handler, this);
|
networkMonitor = new NetworkMonitor(context, handler, this);
|
||||||
networkMisc = misc;
|
networkMisc = misc;
|
||||||
created = false;
|
created = false;
|
||||||
|
validated = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addRequest(NetworkRequest networkRequest) {
|
public void addRequest(NetworkRequest networkRequest) {
|
||||||
|
|||||||
Reference in New Issue
Block a user