am 15cd6ec2: Tear down connection with unwanted linkproperty change

* commit '15cd6ec250d22a093af3961ae1ec3cbbdd49d6b1':
  Tear down connection with unwanted linkproperty change
This commit is contained in:
Wink Saville
2011-05-21 11:13:07 -07:00
committed by Android Git Automerger
3 changed files with 75 additions and 25 deletions

View File

@@ -22,8 +22,10 @@ import com.android.internal.util.Protocol;
import com.android.internal.util.State;
import com.android.internal.util.StateMachine;
import android.net.LinkAddress;
import android.net.LinkCapabilities;
import android.net.LinkProperties;
import android.net.NetworkUtils;
import android.net.ProxyProperties;
import android.os.AsyncResult;
import android.os.Bundle;
@@ -33,6 +35,7 @@ import android.os.Parcelable;
import android.os.SystemProperties;
import android.text.TextUtils;
import java.util.Collection;
import java.util.HashMap;
import java.util.concurrent.atomic.AtomicInteger;
@@ -533,8 +536,10 @@ public abstract class DataConnection extends StateMachine {
return response.setLinkProperties(lp, okToUseSystemPropertyDns);
}
private boolean updateLinkProperty(DataCallState newState) {
boolean changed = false;
private DataConnectionAc.LinkPropertyChangeAction updateLinkProperty(
DataCallState newState) {
DataConnectionAc.LinkPropertyChangeAction changed =
DataConnectionAc.LinkPropertyChangeAction.NONE;
if (newState == null) return changed;
@@ -553,9 +558,23 @@ public abstract class DataConnection extends StateMachine {
if (DBG) log("old LP=" + mLinkProperties);
if (DBG) log("new LP=" + newLp);
// Check consistency of link address. Currently we expect
// only one "global" address is assigned per each IP type.
Collection<LinkAddress> oLinks = mLinkProperties.getLinkAddresses();
Collection<LinkAddress> nLinks = newLp.getLinkAddresses();
for (LinkAddress oldLink : oLinks) {
for (LinkAddress newLink : nLinks) {
if ((NetworkUtils.addressTypeMatches(oldLink.getAddress(),
newLink.getAddress())) &&
(oldLink.equals(newLink) == false)) {
return DataConnectionAc.LinkPropertyChangeAction.RESET;
}
}
}
if (mLinkProperties == null || !mLinkProperties.equals(newLp)) {
mLinkProperties = newLp;
changed = true;
changed = DataConnectionAc.LinkPropertyChangeAction.CHANGED;
}
return changed;
@@ -633,15 +652,14 @@ public abstract class DataConnection extends StateMachine {
}
case DataConnectionAc.REQ_UPDATE_LINK_PROPERTIES_DATA_CALL_STATE: {
DataCallState newState = (DataCallState) msg.obj;
int updated = updateLinkProperty(newState) ? 1 : 0;
DataConnectionAc.LinkPropertyChangeAction action = updateLinkProperty(newState);
if (DBG) {
log("REQ_UPDATE_LINK_PROPERTIES_DATA_CALL_STATE updated="
+ (updated == 1)
+ " newState=" + newState);
log("REQ_UPDATE_LINK_PROPERTIES_DATA_CALL_STATE action="
+ action + " newState=" + newState);
}
mAc.replyToMessage(msg,
DataConnectionAc.RSP_UPDATE_LINK_PROPERTIES_DATA_CALL_STATE,
updated);
action.ordinal());
break;
}
case DataConnectionAc.REQ_GET_LINK_CAPABILITIES: {

View File

@@ -59,6 +59,26 @@ public class DataConnectionAc extends AsyncChannel {
public static final int REQ_RESET = BASE + 14;
public static final int RSP_RESET = BASE + 15;
/**
* enum used to notify action taken or necessary to be
* taken after the link property is changed.
*/
public enum LinkPropertyChangeAction {
NONE, CHANGED, RESET;
public static LinkPropertyChangeAction fromInt(int value) {
if (value == NONE.ordinal()) {
return NONE;
} else if (value == CHANGED.ordinal()) {
return CHANGED;
} else if (value == RESET.ordinal()) {
return RESET;
} else {
throw new RuntimeException("LinkPropertyChangeAction.fromInt: bad value=" + value);
}
}
}
public DataConnectionAc(DataConnection dc, String logTag) {
dataConnection = dc;
mLogTag = logTag;
@@ -234,8 +254,8 @@ public class DataConnectionAc extends AsyncChannel {
if (DBG) log("reqUpdateLinkPropertiesDataCallState");
}
public boolean rspUpdateLinkPropertiesDataCallState(Message response) {
boolean retVal = response.arg1 == 1;
public LinkPropertyChangeAction rspUpdateLinkPropertiesDataCallState(Message response) {
LinkPropertyChangeAction retVal = LinkPropertyChangeAction.fromInt(response.arg1);
if (DBG) log("rspUpdateLinkPropertiesState=" + retVal);
return retVal;
}
@@ -245,7 +265,7 @@ public class DataConnectionAc extends AsyncChannel {
*
* @return true if link property has been updated. false otherwise.
*/
public boolean updateLinkPropertiesDataCallStateSync(DataCallState newState) {
public LinkPropertyChangeAction updateLinkPropertiesDataCallStateSync(DataCallState newState) {
Message response =
sendMessageSynchronously(REQ_UPDATE_LINK_PROPERTIES_DATA_CALL_STATE, newState);
if ((response != null) &&
@@ -253,7 +273,7 @@ public class DataConnectionAc extends AsyncChannel {
return rspUpdateLinkPropertiesDataCallState(response);
} else {
log("getLinkProperties error response=" + response);
return false;
return LinkPropertyChangeAction.NONE;
}
}

View File

@@ -1059,25 +1059,37 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
if (DBG) log("onDataStateChanged(ar): Found ConnId=" + connectionId
+ " newState=" + newState.toString());
if (newState.active != 0) {
boolean changed
= dcac.updateLinkPropertiesDataCallStateSync(newState);
if (changed) {
boolean resetConnection;
switch (dcac.updateLinkPropertiesDataCallStateSync(newState)) {
case NONE:
if (DBG) log("onDataStateChanged(ar): Found but no change, skip");
resetConnection = false;
break;
case CHANGED:
if (DBG) log("onDataStateChanged(ar): Found and changed, notify");
mPhone.notifyDataConnection(Phone.REASON_LINK_PROPERTIES_CHANGED,
apnContext.getApnType());
// Temporary hack, if false we'll reset connections and at this
// time a transition from CDMA -> Global fails. The DEACTIVATE
// fails with a GENERIC_FAILURE and the VZWINTERNET connection is
// never setup. @see bug/
apnContext.getApnType());
// Temporary hack, at this time a transition from CDMA -> Global
// fails so we'll hope for the best and not reset the connection.
// @see bug/4455071
if (SystemProperties.getBoolean("telephony.ignore-state-changes",
true)) {
true)) {
log("onDataStateChanged(ar): STOPSHIP don't reset, continue");
continue;
resetConnection = false;
} else {
// Things changed so reset connection, when hack is removed
// this is the normal path.
log("onDataStateChanged(ar): changed so resetting connection");
resetConnection = true;
}
} else {
if (DBG) log("onDataStateChanged(ar): Found but no change, skip");
continue;
break;
case RESET:
default:
if (DBG) log("onDataStateChanged(ar): an error, reset connection");
resetConnection = true;
break;
}
if (resetConnection == false) continue;
}
}