From d39aecfa333e0be2af3782af954f8dc776a6c792 Mon Sep 17 00:00:00 2001 From: fenglu Date: Fri, 20 Mar 2015 11:29:56 -0700 Subject: [PATCH] LCE service implementation - connectivity side Change-Id: If11bd99c44c7dc8d2aa2bc05a10e04421739baa6 --- .../java/android/net/ConnectivityManager.java | 17 ++++++++++++ .../android/net/IConnectivityManager.aidl | 2 ++ core/java/android/net/NetworkAgent.java | 26 +++++++++++++++++++ .../android/server/ConnectivityService.java | 18 +++++++++++++ 4 files changed, 63 insertions(+) diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index 1125e6deb1..cab893b6e4 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -2455,6 +2455,23 @@ public class ConnectivityManager { sendRequestForNetwork(request.networkCapabilities, networkCallback, 0, LISTEN, TYPE_NONE); } + /** + * Request connectivityservice to refresh network capabilities for the given + * {@link network}. This method returns true if the network is still active, false + * otherwise. Notice the method call assumes the caller has registered for + * listening NetworkCapabilities updates. + * + * @param network{@link Network} specifying which network you're interested. + * @hide + */ + public boolean requestBwUpdate(Network network) { + try { + return mService.requestBwUpdate(network); + } catch (RemoteException e) { + return false; + } + } + /** * Unregisters callbacks about and possibly releases networks originating from * {@link #requestNetwork} and {@link #registerNetworkCallback} calls. If the diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl index 05ef2e60fa..e94ee064fa 100644 --- a/core/java/android/net/IConnectivityManager.aidl +++ b/core/java/android/net/IConnectivityManager.aidl @@ -131,6 +131,8 @@ interface IConnectivityManager void registerNetworkFactory(in Messenger messenger, in String name); + boolean requestBwUpdate(in Network network); + void unregisterNetworkFactory(in Messenger messenger); int registerNetworkAgent(in Messenger messenger, in NetworkInfo ni, in LinkProperties lp, diff --git a/core/java/android/net/NetworkAgent.java b/core/java/android/net/NetworkAgent.java index ddaa808d9b..c33aa2f551 100644 --- a/core/java/android/net/NetworkAgent.java +++ b/core/java/android/net/NetworkAgent.java @@ -52,6 +52,8 @@ public abstract class NetworkAgent extends Handler { private static final boolean VDBG = false; private final Context mContext; private final ArrayListmPreConnectedQueue = new ArrayList(); + private volatile long mLastBwRefreshTime = 0; + private static final long BW_REFRESH_MIN_WIN_MS = 500; private static final int BASE = Protocol.BASE_NETWORK_AGENT; @@ -129,6 +131,13 @@ public abstract class NetworkAgent extends Handler { */ public static final int EVENT_SET_EXPLICITLY_SELECTED = BASE + 8; + /** + * Sent by ConnectivityService to the NetworkAgent to inform the agent to pull + * the underlying network connection for updated bandwidth information. + */ + public static final int CMD_REQUEST_BANDWIDTH_UPDATE = BASE + 9; + + public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni, NetworkCapabilities nc, LinkProperties lp, int score) { this(looper, context, logTag, ni, nc, lp, score, null); @@ -190,6 +199,15 @@ public abstract class NetworkAgent extends Handler { log("Unhandled Message " + msg); break; } + case CMD_REQUEST_BANDWIDTH_UPDATE: { + if (VDBG) { + log("CMD_REQUEST_BANDWIDTH_UPDATE request received."); + } + if (System.currentTimeMillis() > (mLastBwRefreshTime + BW_REFRESH_MIN_WIN_MS)) { + pollLceData(); + } + break; + } case CMD_REPORT_NETWORK_STATUS: { if (VDBG) { log("CMD_REPORT_NETWORK_STATUS(" + @@ -232,6 +250,7 @@ public abstract class NetworkAgent extends Handler { * Called by the bearer code when it has new NetworkCapabilities data. */ public void sendNetworkCapabilities(NetworkCapabilities networkCapabilities) { + mLastBwRefreshTime = System.currentTimeMillis(); queueOrSendMessage(EVENT_NETWORK_CAPABILITIES_CHANGED, new NetworkCapabilities(networkCapabilities)); } @@ -279,6 +298,13 @@ public abstract class NetworkAgent extends Handler { */ abstract protected void unwanted(); + /** + * Called when ConnectivityService request a bandwidth update. The parent factory + * shall try to overwrite this method and produce a bandwidth update if capable. + */ + protected void pollLceData() { + } + /** * Called when the system determines the usefulness of this network. * diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index ff6dc38298..d83ef6fedb 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -3289,6 +3289,24 @@ public class ConnectivityService extends IConnectivityManager.Stub } } + @Override + public boolean requestBwUpdate(Network network) { + enforceAccessPermission(); + NetworkAgentInfo nai = null; + if (network == null) { + return false; + } + synchronized (mNetworkForNetId) { + nai = mNetworkForNetId.get(network.netId); + } + if (nai != null) { + nai.asyncChannel.sendMessage(android.net.NetworkAgent.CMD_REQUEST_BANDWIDTH_UPDATE); + return true; + } + return false; + } + + private void enforceMeteredApnPolicy(NetworkCapabilities networkCapabilities) { // if UID is restricted, don't allow them to bring up metered APNs if (networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)