Add NetworkFactory names and unregistration.

Some Factories come and go (Telephony) and so they need to be able to unregister.
Also, debugging is tough when the factories are anonymous, so add names for logging.

Lastly, only send single set of NetworkRequests to a newly registered NetworkFactory
and only send the requests.

Change-Id: I717d63363f25c446f8ecf38d933b1a35d744af6e
This commit is contained in:
Robert Greenwalt
2014-05-16 15:49:14 -07:00
parent 42debe7dd6
commit 46dcbab0a2
3 changed files with 82 additions and 28 deletions

View File

@@ -1655,9 +1655,16 @@ public class ConnectivityManager {
} }
/** {@hide} */ /** {@hide} */
public void registerNetworkFactory(Messenger messenger) { public void registerNetworkFactory(Messenger messenger, String name) {
try { try {
mService.registerNetworkFactory(messenger); mService.registerNetworkFactory(messenger, name);
} catch (RemoteException e) { }
}
/** {@hide} */
public void unregisterNetworkFactory(Messenger messenger) {
try {
mService.unregisterNetworkFactory(messenger);
} catch (RemoteException e) { } } catch (RemoteException e) { }
} }

View File

@@ -153,7 +153,9 @@ interface IConnectivityManager
void setAirplaneMode(boolean enable); void setAirplaneMode(boolean enable);
void registerNetworkFactory(in Messenger messenger); void registerNetworkFactory(in Messenger messenger, in String name);
void unregisterNetworkFactory(in Messenger messenger);
void registerNetworkAgent(in Messenger messenger, in NetworkInfo ni, in LinkProperties lp, void registerNetworkAgent(in Messenger messenger, in NetworkInfo ni, in LinkProperties lp,
in NetworkCapabilities nc, int score); in NetworkCapabilities nc, int score);

View File

@@ -398,7 +398,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
/** /**
* used internally when registering NetworkFactories * used internally when registering NetworkFactories
* obj = Messenger * obj = NetworkFactoryInfo
*/ */
private static final int EVENT_REGISTER_NETWORK_FACTORY = 17; private static final int EVENT_REGISTER_NETWORK_FACTORY = 17;
@@ -434,6 +434,13 @@ public class ConnectivityService extends IConnectivityManager.Stub {
*/ */
private static final int EVENT_RELEASE_NETWORK_REQUEST = 22; private static final int EVENT_RELEASE_NETWORK_REQUEST = 22;
/**
* used internally when registering NetworkFactories
* obj = Messenger
*/
private static final int EVENT_UNREGISTER_NETWORK_FACTORY = 23;
/** Handler used for internal events. */ /** Handler used for internal events. */
final private InternalHandler mHandler; final private InternalHandler mHandler;
/** Handler used for incoming {@link NetworkStateTracker} events. */ /** Handler used for incoming {@link NetworkStateTracker} events. */
@@ -2889,6 +2896,14 @@ public class ConnectivityService extends IConnectivityManager.Stub {
return; return;
} }
pw.println("NetworkFactories for:");
pw.increaseIndent();
for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) {
pw.println(nfi.name);
}
pw.decreaseIndent();
pw.println();
NetworkAgentInfo defaultNai = mNetworkForRequestId.get(mDefaultRequest.requestId); NetworkAgentInfo defaultNai = mNetworkForRequestId.get(mDefaultRequest.requestId);
pw.print("Active default network: "); pw.print("Active default network: ");
if (defaultNai == null) { if (defaultNai == null) {
@@ -2983,6 +2998,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
if (nai == null) { if (nai == null) {
loge("NetworkAgent not found for EVENT_NETWORK_PROPERTIES_CHANGED"); loge("NetworkAgent not found for EVENT_NETWORK_PROPERTIES_CHANGED");
} else { } else {
if (VDBG) log("Update of Linkproperties for " + nai.name());
LinkProperties oldLp = nai.linkProperties; LinkProperties oldLp = nai.linkProperties;
nai.linkProperties = (LinkProperties)msg.obj; nai.linkProperties = (LinkProperties)msg.obj;
updateLinkProperties(nai, oldLp); updateLinkProperties(nai, oldLp);
@@ -3096,18 +3112,19 @@ public class ConnectivityService extends IConnectivityManager.Stub {
private void handleAsyncChannelHalfConnect(Message msg) { private void handleAsyncChannelHalfConnect(Message msg) {
AsyncChannel ac = (AsyncChannel) msg.obj; AsyncChannel ac = (AsyncChannel) msg.obj;
if (mNetworkFactories.contains(ac)) { if (mNetworkFactoryInfos.containsKey(msg.replyTo)) {
if (msg.arg1 == AsyncChannel.STATUS_SUCCESSFUL) { if (msg.arg1 == AsyncChannel.STATUS_SUCCESSFUL) {
if (VDBG) log("NetworkFactory connected"); if (VDBG) log("NetworkFactory connected");
// A network factory has connected. Send it all current NetworkRequests. // A network factory has connected. Send it all current NetworkRequests.
for (NetworkRequestInfo nri : mNetworkRequests.values()) { for (NetworkRequestInfo nri : mNetworkRequests.values()) {
if (nri.isRequest == false) continue;
NetworkAgentInfo nai = mNetworkForRequestId.get(nri.request.requestId); NetworkAgentInfo nai = mNetworkForRequestId.get(nri.request.requestId);
ac.sendMessage(NetworkFactoryProtocol.CMD_REQUEST_NETWORK, ac.sendMessage(NetworkFactoryProtocol.CMD_REQUEST_NETWORK,
(nai != null ? nai.currentScore : 0), 0, nri.request); (nai != null ? nai.currentScore : 0), 0, nri.request);
} }
} else { } else {
loge("Error connecting NetworkFactory"); loge("Error connecting NetworkFactory");
mNetworkFactories.remove(ac); mNetworkFactoryInfos.remove(msg.obj);
} }
} else if (mNetworkAgentInfos.containsKey(msg.replyTo)) { } else if (mNetworkAgentInfos.containsKey(msg.replyTo)) {
if (msg.arg1 == AsyncChannel.STATUS_SUCCESSFUL) { if (msg.arg1 == AsyncChannel.STATUS_SUCCESSFUL) {
@@ -3214,8 +3231,8 @@ public class ConnectivityService extends IConnectivityManager.Stub {
mNetworkRequests.put(nri.request, nri); mNetworkRequests.put(nri.request, nri);
if (msg.what == EVENT_REGISTER_NETWORK_REQUEST) { if (msg.what == EVENT_REGISTER_NETWORK_REQUEST) {
if (DBG) log("sending new NetworkRequest to factories"); if (DBG) log("sending new NetworkRequest to factories");
for (AsyncChannel ac : mNetworkFactories) { for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) {
ac.sendMessage(NetworkFactoryProtocol.CMD_REQUEST_NETWORK, score, 0, nri.request); nfi.asyncChannel.sendMessage(NetworkFactoryProtocol.CMD_REQUEST_NETWORK, score, 0, nri.request);
} }
} }
} }
@@ -3236,8 +3253,8 @@ public class ConnectivityService extends IConnectivityManager.Stub {
} }
if (nri.isRequest) { if (nri.isRequest) {
for (AsyncChannel factory : mNetworkFactories) { for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) {
factory.sendMessage(NetworkFactoryProtocol.CMD_CANCEL_REQUEST, nri.request); nfi.asyncChannel.sendMessage(NetworkFactoryProtocol.CMD_CANCEL_REQUEST, nri.request);
} }
if (affectedNetwork != null) { if (affectedNetwork != null) {
@@ -3356,7 +3373,11 @@ public class ConnectivityService extends IConnectivityManager.Stub {
break; break;
} }
case EVENT_REGISTER_NETWORK_FACTORY: { case EVENT_REGISTER_NETWORK_FACTORY: {
handleRegisterNetworkFactory((Messenger)msg.obj); handleRegisterNetworkFactory((NetworkFactoryInfo)msg.obj);
break;
}
case EVENT_UNREGISTER_NETWORK_FACTORY: {
handleUnregisterNetworkFactory((Messenger)msg.obj);
break; break;
} }
case EVENT_REGISTER_NETWORK_AGENT: { case EVENT_REGISTER_NETWORK_AGENT: {
@@ -5222,10 +5243,22 @@ public class ConnectivityService extends IConnectivityManager.Stub {
mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, wakeupTime, intent); mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, wakeupTime, intent);
} }
private final ArrayList<AsyncChannel> mNetworkFactories = new ArrayList<AsyncChannel>(); private final HashMap<Messenger, NetworkFactoryInfo> mNetworkFactoryInfos =
new HashMap<Messenger, NetworkFactoryInfo>();
private final HashMap<NetworkRequest, NetworkRequestInfo> mNetworkRequests = private final HashMap<NetworkRequest, NetworkRequestInfo> mNetworkRequests =
new HashMap<NetworkRequest, NetworkRequestInfo>(); new HashMap<NetworkRequest, NetworkRequestInfo>();
private static class NetworkFactoryInfo {
public final String name;
public final Messenger messenger;
public final AsyncChannel asyncChannel;
public NetworkFactoryInfo(String name, Messenger messenger, AsyncChannel asyncChannel) {
this.name = name;
this.messenger = messenger;
this.asyncChannel = asyncChannel;
}
}
private class NetworkRequestInfo implements IBinder.DeathRecipient { private class NetworkRequestInfo implements IBinder.DeathRecipient {
static final boolean REQUEST = true; static final boolean REQUEST = true;
@@ -5263,6 +5296,11 @@ public class ConnectivityService extends IConnectivityManager.Stub {
request + ", " + mBinder + ")"); request + ", " + mBinder + ")");
releaseNetworkRequest(request); releaseNetworkRequest(request);
} }
public String toString() {
return (isRequest ? "Request" : "Listen") + " from uid/pid:" + mUid + "/" +
mPid + " for " + request;
}
} }
@Override @Override
@@ -5326,24 +5364,31 @@ public class ConnectivityService extends IConnectivityManager.Stub {
} }
@Override @Override
public void registerNetworkFactory(Messenger messenger) { public void registerNetworkFactory(Messenger messenger, String name) {
enforceConnectivityInternalPermission(); enforceConnectivityInternalPermission();
mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_FACTORY, messenger)); NetworkFactoryInfo nfi = new NetworkFactoryInfo(name, messenger, new AsyncChannel());
mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_FACTORY, nfi));
} }
private void handleRegisterNetworkFactory(Messenger messenger) { private void handleRegisterNetworkFactory(NetworkFactoryInfo nfi) {
if (VDBG) log("Got NetworkFactory Messenger"); if (VDBG) log("Got NetworkFactory Messenger for " + nfi.name);
AsyncChannel ac = new AsyncChannel(); mNetworkFactoryInfos.put(nfi.messenger, nfi);
mNetworkFactories.add(ac); nfi.asyncChannel.connect(mContext, mTrackerHandler, nfi.messenger);
ac.connect(mContext, mTrackerHandler, messenger); }
for (NetworkRequestInfo nri : mNetworkRequests.values()) {
if (nri.isRequest) { @Override
int score = 0; public void unregisterNetworkFactory(Messenger messenger) {
NetworkAgentInfo currentNetwork = mNetworkForRequestId.get(nri.request.requestId); enforceConnectivityInternalPermission();
if (currentNetwork != null) score = currentNetwork.currentScore; mHandler.sendMessage(mHandler.obtainMessage(EVENT_UNREGISTER_NETWORK_FACTORY, messenger));
ac.sendMessage(NetworkFactoryProtocol.CMD_REQUEST_NETWORK, score, 0, nri.request); }
}
private void handleUnregisterNetworkFactory(Messenger messenger) {
NetworkFactoryInfo nfi = mNetworkFactoryInfos.remove(messenger);
if (nfi == null) {
if (VDBG) log("Failed to find Messenger in unregisterNetworkFactory");
return;
} }
if (VDBG) log("unregisterNetworkFactory for " + nfi.name);
} }
/** /**
@@ -5535,8 +5580,8 @@ public class ConnectivityService extends IConnectivityManager.Stub {
private void sendUpdatedScoreToFactories(NetworkRequest networkRequest, int score) { private void sendUpdatedScoreToFactories(NetworkRequest networkRequest, int score) {
if (VDBG) log("sending new Min Network Score(" + score + "): " + networkRequest.toString()); if (VDBG) log("sending new Min Network Score(" + score + "): " + networkRequest.toString());
for (AsyncChannel ac : mNetworkFactories) { for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) {
ac.sendMessage(NetworkFactoryProtocol.CMD_REQUEST_NETWORK, score, 0, networkRequest); nfi.asyncChannel.sendMessage(NetworkFactoryProtocol.CMD_REQUEST_NETWORK, score, 0, networkRequest);
} }
} }