diff options
author | Wink Saville <wink@google.com> | 2011-05-24 02:38:17 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2011-05-24 02:38:17 -0700 |
commit | cb3fad5cbeffd876057921ddae3752a740fb7590 (patch) | |
tree | b29dc77f0fb4843540a6f5614eb0cbec650a96fc /telephony | |
parent | d24c1dfe2b655a3243dc7608ceb18dbb913862d8 (diff) | |
parent | 7abbf93c854cd7d272183b674373e989a05da6dd (diff) | |
download | frameworks_base-cb3fad5cbeffd876057921ddae3752a740fb7590.zip frameworks_base-cb3fad5cbeffd876057921ddae3752a740fb7590.tar.gz frameworks_base-cb3fad5cbeffd876057921ddae3752a740fb7590.tar.bz2 |
am 7abbf93c: am 15cd6ec2: Tear down connection with unwanted linkproperty change
* commit '7abbf93c854cd7d272183b674373e989a05da6dd':
Tear down connection with unwanted linkproperty change
Diffstat (limited to 'telephony')
3 files changed, 75 insertions, 25 deletions
diff --git a/telephony/java/com/android/internal/telephony/DataConnection.java b/telephony/java/com/android/internal/telephony/DataConnection.java index 1ac9d1f..dc07ef2 100644 --- a/telephony/java/com/android/internal/telephony/DataConnection.java +++ b/telephony/java/com/android/internal/telephony/DataConnection.java @@ -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: { diff --git a/telephony/java/com/android/internal/telephony/DataConnectionAc.java b/telephony/java/com/android/internal/telephony/DataConnectionAc.java index 2ab6184..939bab2 100644 --- a/telephony/java/com/android/internal/telephony/DataConnectionAc.java +++ b/telephony/java/com/android/internal/telephony/DataConnectionAc.java @@ -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; } } diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java index 80395ed..564f001 100644 --- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java +++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java @@ -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; } } |