DO NOT MERGE - backport of l92a02b31 from master

Fix handling of multiple possible default networks.

bug:3328196
Change-Id: I994f1621ff82de454192945a9cae961e1710d537
This commit is contained in:
Robert Greenwalt
2011-02-11 17:32:58 -08:00
parent 9d07781cb6
commit 084e4774f2

View File

@@ -1037,62 +1037,35 @@ public class ConnectivityService extends IConnectivityManager.Stub {
for (int checkType=0; checkType <= ConnectivityManager.MAX_NETWORK_TYPE; checkType++) { for (int checkType=0; checkType <= ConnectivityManager.MAX_NETWORK_TYPE; checkType++) {
if (checkType == prevNetType) continue; if (checkType == prevNetType) continue;
if (mNetAttributes[checkType] == null) continue; if (mNetAttributes[checkType] == null) continue;
if (mNetAttributes[checkType].isDefault() == false) continue;
if (mNetAttributes[checkType].mRadio == ConnectivityManager.TYPE_MOBILE && if (mNetAttributes[checkType].mRadio == ConnectivityManager.TYPE_MOBILE &&
noMobileData) { noMobileData) {
Slog.e(TAG, "not failing over to mobile type " + checkType + Slog.e(TAG, "not failing over to mobile type " + checkType +
" because Mobile Data Disabled"); " because Mobile Data Disabled");
continue; continue;
} }
if (mNetAttributes[checkType].isDefault()) { NetworkStateTracker tracker = mNetTrackers[checkType];
/* TODO - if we have multiple nets we could use NetworkInfo info = tracker.getNetworkInfo();
* we may want to put more thought into which we choose if (!info.isConnectedOrConnecting() ||
*/ tracker.isTeardownRequested()) {
info.setFailover(true);
tracker.reconnect();
}
if (DBG) Slog.d(TAG, "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) { if (checkType == mNetworkPreference) {
newType = checkType; newType = checkType;
break;
} }
if (mNetAttributes[checkType].mPriority > newPriority) { if (mNetAttributes[checkType].mPriority > newPriority &&
newType != mNetworkPreference) {
newType = checkType; newType = checkType;
newPriority = mNetAttributes[newType].mPriority; newPriority = mNetAttributes[checkType].mPriority;
} }
} }
} }
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()) {
Slog.v(TAG, "Switching to already connected " +
switchTo.getTypeName());
} else {
Slog.v(TAG, "Attempting to switch to " +
switchTo.getTypeName());
}
}
} else {
newNet.reconnect();
newNet = null; // not officially avail.. try anyway, but
// report no failover
}
} else {
Slog.e(TAG, "Network failover failing.");
}
}
return newNet; return newNet;
} }