summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Robert Greenwalt <rgreenwalt@google.com> 2011-12-19 16:51:40 -0800
committer Robert Greenwalt <rgreenwalt@google.com> 2011-12-20 17:28:58 -0800
commit2cc19b1cc93a176bf15d83f05e3c43b90bfe279c (patch)
tree45005be795921fbdcac13733e44ab64382b95f4f
parent01583ef715641c8a3ce68269b091e75adbe9335a (diff)
Use shared connections over retries.
Old code would detect we were in a retry loop and ignore other active connections we could share. We really want live shared connections to dominate over retrying disconnected ones. bug:5525764 Change-Id: If93383c52024113eec595b31e46897d1fcabc44c
-rw-r--r--telephony/java/com/android/internal/telephony/gsm/GsmDataConnection.java5
-rw-r--r--telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java71
2 files changed, 43 insertions, 33 deletions
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnection.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnection.java
index 1f24b58ce538..dbb35f25d0b1 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnection.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnection.java
@@ -36,7 +36,6 @@ public class GsmDataConnection extends DataConnection {
//***** Instance Variables
protected int mProfileId = RILConstants.DATA_PROFILE_DEFAULT;
- protected String mActiveApnType = Phone.APN_TYPE_DEFAULT;
//***** Constructor
private GsmDataConnection(PhoneBase phone, String name, int id, RetryManager rm) {
super(phone, name, id, rm);
@@ -113,10 +112,6 @@ public class GsmDataConnection extends DataConnection {
return mProfileId;
}
- public void setActiveApnType(String apnType) {
- mActiveApnType = apnType;
- }
-
@Override
public String toString() {
return "State=" + getCurrentState().getName() + " Apn=" + mApn +
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
index 963db2c6809d..fd85642fafce 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
@@ -993,17 +993,11 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
return false;
}
- // First, check to see if ApnContext already has DC.
- // This could happen if the retries are currently engaged.
- dc = (GsmDataConnection)apnContext.getDataConnection();
- if (dc == null) {
-
- dc = (GsmDataConnection) checkForConnectionForApnContext(apnContext);
+ dc = (GsmDataConnection) checkForConnectionForApnContext(apnContext);
- if (dc == null) {
- dc = findReadyDataConnection(apn);
- }
+ if (dc == null) {
+ dc = findReadyDataConnection(apn);
if (dc == null) {
if (DBG) log("setupData: No ready GsmDataConnection found!");
@@ -1020,20 +1014,22 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
if (DBG) log("setupData: No free GsmDataConnection found!");
return false;
}
+ } else {
+ apn = mDataConnectionAsyncChannels.get(dc.getDataConnectionId()).getApnSettingSync();
+ }
- DataConnectionAc dcac = mDataConnectionAsyncChannels.get(dc.getDataConnectionId());
- dc.setProfileId( profileId );
- dc.setActiveApnType(apnContext.getApnType());
- int refCount = dcac.getRefCountSync();
- if (DBG) log("setupData: init dc and apnContext refCount=" + refCount);
+ DataConnectionAc dcac = mDataConnectionAsyncChannels.get(dc.getDataConnectionId());
+ dc.setProfileId( profileId ); // assumed no connection sharing on profiled types
- // configure retry count if no other Apn is using the same connection.
- if (refCount == 0) {
- configureRetry(dc, apn.canHandleType(Phone.APN_TYPE_DEFAULT));
- }
- apnContext.setDataConnectionAc(dcac);
- apnContext.setDataConnection(dc);
+ int refCount = dcac.getRefCountSync();
+ if (DBG) log("setupData: init dc and apnContext refCount=" + refCount);
+
+ // configure retry count if no other Apn is using the same connection.
+ if (refCount == 0) {
+ configureRetry(dc, apn.canHandleType(Phone.APN_TYPE_DEFAULT));
}
+ apnContext.setDataConnectionAc(dcac);
+ apnContext.setDataConnection(dc);
apnContext.setApnSetting(apn);
apnContext.setState(State.INITING);
@@ -1732,27 +1728,46 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
dunSetting = fetchDunApn();
}
+ DataConnection potential = null;
for (ApnContext c : mApnContexts.values()) {
DataConnection conn = c.getDataConnection();
if (conn != null) {
ApnSetting apnSetting = c.getApnSetting();
if (dunSetting != null) {
if (dunSetting.equals(apnSetting)) {
- if (DBG) {
- log("checkForConnectionForApnContext: apnContext=" + apnContext +
- " found conn=" + conn);
+ switch (c.getState()) {
+ case CONNECTED:
+ if (DBG) {
+ log("checkForConnectionForApnContext: apnContext=" +
+ apnContext + " found conn=" + conn);
+ }
+ return conn;
+ case CONNECTING:
+ potential = conn;
}
- return conn;
}
} else if (apnSetting != null && apnSetting.canHandleType(apnType)) {
- if (DBG) {
- log("checkForConnectionForApnContext: apnContext=" + apnContext +
- " found conn=" + conn);
+ switch (c.getState()) {
+ case CONNECTED:
+ if (DBG) {
+ log("checkForConnectionForApnContext: apnContext=" + apnContext +
+ " found conn=" + conn);
+ }
+ return conn;
+ case CONNECTING:
+ potential = conn;
}
- return conn;
}
}
}
+ if (potential != null) {
+ if (DBG) {
+ log("checkForConnectionForApnContext: apnContext=" + apnContext +
+ " found conn=" + potential);
+ }
+ return potential;
+ }
+
if (DBG) log("checkForConnectionForApnContext: apnContext=" + apnContext + " NO conn");
return null;
}