From 9256485b0b00f92de9bd3f51c5dffdf7bf7f64ed Mon Sep 17 00:00:00 2001 From: Robert Greenwalt Date: Thu, 6 Jan 2011 15:41:07 -0800 Subject: [PATCH] Fix handling of multiple possible default networks Old code assumed only 2 choices but now we have more. bug:3328196 Change-Id: I92a02b31fae6c53f73b3684581230fad5cb1b82a --- .../android/server/ConnectivityService.java | 72 +++++++------------ 1 file changed, 25 insertions(+), 47 deletions(-) diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java index 3b47bce4a7..b1eead2c13 100644 --- a/services/java/com/android/server/ConnectivityService.java +++ b/services/java/com/android/server/ConnectivityService.java @@ -1132,11 +1132,13 @@ public class ConnectivityService extends IConnectivityManager.Stub { } } - // returns null if no failover available + // returns null if no failover available, otherwise returns the highest + // priority network we're trying private NetworkStateTracker tryFailover(int prevNetType) { /* - * If this is a default network, check if other defaults are available - * or active + * If this is a default network, check if other defaults are available. + * Try to reconnect on all available and let them hash it out when + * more than one connects. */ NetworkStateTracker newNet = null; if (mNetAttributes[prevNetType].isDefault()) { @@ -1149,54 +1151,30 @@ public class ConnectivityService extends IConnectivityManager.Stub { for (int checkType=0; checkType <= ConnectivityManager.MAX_NETWORK_TYPE; checkType++) { if (checkType == prevNetType) continue; if (mNetAttributes[checkType] == null) continue; - if (mNetAttributes[checkType].isDefault()) { - /* TODO - if we have multiple nets we could use - * we may want to put more thought into which we choose - */ - if (checkType == mNetworkPreference) { - newType = checkType; - break; - } - if (mNetAttributes[checkType].mPriority > newPriority) { - newType = checkType; - newPriority = mNetAttributes[newType].mPriority; - } - } - } + if (!mNetAttributes[checkType].isDefault()) continue; + if (!mNetTrackers[checkType].isAvailable()) continue; - if (newType != -1) { - newNet = mNetTrackers[newType]; - /** - * See if the other network is available to fail over to. - * If is not available, we enable it anyway, so that it - * will be able to connect when it does become available, - * but we report a total loss of connectivity rather than - * report that we are attempting to fail over. - */ - if (newNet.isAvailable()) { - NetworkInfo switchTo = newNet.getNetworkInfo(); - switchTo.setFailover(true); - if (!switchTo.isConnectedOrConnecting() || - newNet.isTeardownRequested()) { - newNet.reconnect(); - } - if (DBG) { - if (switchTo.isConnected()) { - log("Switching to already connected " + switchTo.getTypeName()); - } else { - log("Attempting to switch to " + switchTo.getTypeName()); - } - } - } else { - newNet.reconnect(); - newNet = null; // not officially avail.. try anyway, but - // report no failover + NetworkStateTracker tracker = mNetTrackers[checkType]; + NetworkInfo info = tracker.getNetworkInfo(); + if (!info.isConnectedOrConnecting() || + tracker.isTeardownRequested()) { + info.setFailover(true); + tracker.reconnect(); + } + if (DBG) log("Attempting to switch to " + info.getTypeName()); + + // figure out if this is the highest priority network + // so we send an appropriate return value + if (checkType == mNetworkPreference) { + newType = checkType; + } + if (mNetAttributes[checkType].mPriority > newPriority && + newType != mNetworkPreference) { + newType = checkType; + newPriority = mNetAttributes[newType].mPriority; } - } else { - loge("Network failover failing."); } } - return newNet; }