From aa6ff6c7b0b576aa75cbd9fb5cdd95fa6cbc49bb Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Mon, 8 Dec 2014 14:50:12 -0800 Subject: [PATCH] Direct notification of network interface changes. Connectivity broadcasts recently changed and are no longer sent for certain types of network changes. For example, when stacked network interfaces change for a mobile network. To ensure that we pick up all these details, directly wire the two services together. Also remove some unused code for split network types. Bug: 18666753 Change-Id: I0467bd5b330c0e0cb51af2306d821b41ad16337a --- .../com/android/server/ConnectivityService.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index dde158cddd..a86d564f6b 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -231,6 +231,7 @@ public class ConnectivityService extends IConnectivityManager.Stub private static ConnectivityService sServiceInstance; private INetworkManagementService mNetd; + private INetworkStatsService mStatsService; private INetworkPolicyManager mPolicyManager; private String mCurrentTcpBufferSizes; @@ -630,6 +631,7 @@ public class ConnectivityService extends IConnectivityManager.Stub mContext = checkNotNull(context, "missing Context"); mNetd = checkNotNull(netManager, "missing INetworkManagementService"); + mStatsService = checkNotNull(statsService, "missing INetworkStatsService"); mPolicyManager = checkNotNull(policyManager, "missing INetworkPolicyManager"); mKeyStore = KeyStore.getInstance(); mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); @@ -2166,6 +2168,7 @@ public class ConnectivityService extends IConnectivityManager.Stub if (isDefaultNetwork(nai)) { mDefaultInetConditionPublished = 0; } + notifyIfacesChanged(); notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_LOST); nai.networkMonitor.sendMessage(NetworkMonitor.CMD_NETWORK_DISCONNECTED); mNetworkAgentInfos.remove(msg.replyTo); @@ -3660,6 +3663,7 @@ public class ConnectivityService extends IConnectivityManager.Stub if (isDefaultNetwork(networkAgent)) handleApplyDefaultProxy(newLp.getHttpProxy()); // TODO - move this check to cover the whole function if (!Objects.equals(newLp, oldLp)) { + notifyIfacesChanged(); notifyNetworkCallbacks(networkAgent, ConnectivityManager.CALLBACK_IP_CHANGED); } } @@ -4250,6 +4254,7 @@ public class ConnectivityService extends IConnectivityManager.Stub } networkAgent.created = true; updateLinkProperties(networkAgent, null); + notifyIfacesChanged(); notifyNetworkCallbacks(networkAgent, ConnectivityManager.CALLBACK_PRECHECK); networkAgent.networkMonitor.sendMessage(NetworkMonitor.CMD_NETWORK_CONNECTED); if (networkAgent.isVPN()) { @@ -4393,6 +4398,16 @@ public class ConnectivityService extends IConnectivityManager.Stub return "UNKNOWN"; } + /** + * Notify other system services that set of active ifaces has changed. + */ + private void notifyIfacesChanged() { + try { + mStatsService.forceUpdateIfaces(); + } catch (Exception ignored) { + } + } + @Override public boolean addVpnAddress(String address, int prefixLength) { throwIfLockdownEnabled();