Add support for DUN over a cdma connection.
It uses the data profile paramater when setting up the connection to indicate
it's a tethered connection. We get different behavior from vzw afterwards, so
it is getting picked up.
bug:2422545
Change-Id: Ic022845088726d723813b82e166d15d7b2945da1
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnection.java b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnection.java
index 6c20204..95cb1c6 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnection.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnection.java
@@ -20,6 +20,8 @@
import android.util.Log;
import com.android.internal.telephony.DataConnection;
+import com.android.internal.telephony.gsm.ApnSetting;
+import com.android.internal.telephony.Phone;
import com.android.internal.telephony.RILConstants;
/**
@@ -71,12 +73,20 @@
createTime = -1;
lastFailTime = -1;
lastFailCause = FailCause.NONE;
+ int dataProfile;
+ if ((cp.apn != null) && (cp.apn.types.length > 0) && (cp.apn.types[0] != null) &&
+ (cp.apn.types[0].equals(Phone.APN_TYPE_DUN))) {
+ if (DBG) log("CdmaDataConnection using DUN");
+ dataProfile = RILConstants.DATA_PROFILE_TETHERED;
+ } else {
+ dataProfile = RILConstants.DATA_PROFILE_DEFAULT;
+ }
// msg.obj will be returned in AsyncResult.userObj;
Message msg = obtainMessage(EVENT_SETUP_DATA_CONNECTION_DONE, cp);
msg.obj = cp;
phone.mCM.setupDataCall(Integer.toString(RILConstants.SETUP_DATA_TECH_CDMA),
- Integer.toString(RILConstants.DATA_PROFILE_DEFAULT), null, null,
+ Integer.toString(dataProfile), null, null,
null, Integer.toString(RILConstants.SETUP_DATA_AUTH_PAP_CHAP), msg);
}
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
index af9c652..2f801cc 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
@@ -48,6 +48,7 @@
import com.android.internal.telephony.DataConnection;
import com.android.internal.telephony.DataConnectionTracker;
import com.android.internal.telephony.EventLogTags;
+import com.android.internal.telephony.gsm.ApnSetting;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.RetryManager;
import com.android.internal.telephony.ServiceStateTracker;
@@ -77,9 +78,6 @@
/** Currently active CdmaDataConnection */
private CdmaDataConnection mActiveDataConnection;
- /** mimic of GSM's mActiveApn */
- private boolean mIsApnActive = false;
-
private boolean mPendingRestartRadio = false;
private static final int TIME_DELAYED_TO_RESTART_RADIO =
SystemProperties.getInt("ro.cdma.timetoradiorestart", 60000);
@@ -108,6 +106,14 @@
Phone.APN_TYPE_DUN,
Phone.APN_TYPE_HIPRI };
+ private static final String[] mDefaultApnTypes = {
+ Phone.APN_TYPE_DEFAULT,
+ Phone.APN_TYPE_MMS,
+ Phone.APN_TYPE_HIPRI };
+
+ // if we have no active Apn this is null
+ protected ApnSetting mActiveApn;
+
// Possibly promoate to base class, the only difference is
// the INTENT_RECONNECT_ALARM action is a different string.
// Do consider technology changes if it is promoted.
@@ -250,7 +256,7 @@
@Override
protected boolean isApnTypeActive(String type) {
- return (mIsApnActive && isApnTypeAvailable(type));
+ return mActiveApn != null && mActiveApn.canHandleType(type);
}
@Override
@@ -265,10 +271,9 @@
protected String[] getActiveApnTypes() {
String[] result;
- if (mIsApnActive) {
- result = mSupportedApnTypes.clone();
+ if (mActiveApn != null) {
+ result = mActiveApn.types;
} else {
- // TODO - should this return an empty array? See GSM too.
result = new String[1];
result[0] = Phone.APN_TYPE_DEFAULT;
}
@@ -414,7 +419,6 @@
}
private boolean setupData(String reason) {
-
CdmaDataConnection conn = findFreeDataConnection();
if (conn == null) {
@@ -423,12 +427,19 @@
}
mActiveDataConnection = conn;
- mIsApnActive = true;
+ String[] types;
+ if (mRequestedApnType.equals(Phone.APN_TYPE_DUN)) {
+ types = new String[1];
+ types[0] = Phone.APN_TYPE_DUN;
+ } else {
+ types = mDefaultApnTypes;
+ }
+ mActiveApn = new ApnSetting(0, "", "", "", "", "", "", "", "", "", "", 0, types);
Message msg = obtainMessage();
msg.what = EVENT_DATA_SETUP_COMPLETE;
msg.obj = reason;
- conn.connect(msg);
+ conn.connect(msg, mActiveApn);
setState(State.INITING);
phone.notifyDataConnection(reason);
@@ -627,7 +638,7 @@
if (DBG) log("gotoIdleAndNotifyDataConnection: reason=" + reason);
setState(State.IDLE);
phone.notifyDataConnection(reason);
- mIsApnActive = false;
+ mActiveApn = null;
}
protected void onRecordsLoaded() {
@@ -649,8 +660,7 @@
*/
@Override
protected void onEnableNewApn() {
- // for cdma we only use this when default data is enabled..
- onTrySetupData(Phone.REASON_DATA_ENABLED);
+ cleanUpConnection(true, Phone.REASON_APN_SWITCHED);
}
/**
@@ -763,7 +773,7 @@
}
phone.notifyDataConnection(reason);
- mIsApnActive = false;
+ mActiveApn = null;
if (retryAfterDisconnected(reason)) {
trySetupData(reason);
}
diff --git a/telephony/java/com/android/internal/telephony/gsm/ApnSetting.java b/telephony/java/com/android/internal/telephony/gsm/ApnSetting.java
index 8d807fd..4cbfc87 100644
--- a/telephony/java/com/android/internal/telephony/gsm/ApnSetting.java
+++ b/telephony/java/com/android/internal/telephony/gsm/ApnSetting.java
@@ -32,12 +32,12 @@
String user;
String password;
int authType;
- String[] types;
+ public String[] types;
int id;
String numeric;
- ApnSetting(int id, String numeric, String carrier, String apn, String proxy, String port,
+ public ApnSetting(int id, String numeric, String carrier, String apn, String proxy, String port,
String mmsc, String mmsProxy, String mmsPort,
String user, String password, int authType, String[] types) {
this.id = id;
@@ -73,7 +73,7 @@
return sb.toString();
}
- boolean canHandleType(String type) {
+ public boolean canHandleType(String type) {
for (String t : types) {
// DEFAULT handles all, and HIPRI is handled by DEFAULT
if (t.equals(type) || t.equals(Phone.APN_TYPE_ALL) ||