summaryrefslogtreecommitdiffstats
path: root/telephony
diff options
context:
space:
mode:
authorWink Saville <wink@google.com>2011-05-24 02:38:17 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2011-05-24 02:38:17 -0700
commitcb3fad5cbeffd876057921ddae3752a740fb7590 (patch)
treeb29dc77f0fb4843540a6f5614eb0cbec650a96fc /telephony
parentd24c1dfe2b655a3243dc7608ceb18dbb913862d8 (diff)
parent7abbf93c854cd7d272183b674373e989a05da6dd (diff)
downloadframeworks_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')
-rw-r--r--telephony/java/com/android/internal/telephony/DataConnection.java34
-rw-r--r--telephony/java/com/android/internal/telephony/DataConnectionAc.java28
-rw-r--r--telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java38
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;
}
}