am 7874efeb: am c8711ca7: Merge "Stop using shared DUN APN when tethering stops." into ics-mr1

* commit '7874efeb138204230475720d0b97f2d199a21502':
  Stop using shared DUN APN when tethering stops.
This commit is contained in:
Robert Greenwalt
2012-02-14 16:25:11 -08:00
committed by Android Git Automerger
7 changed files with 146 additions and 39 deletions

View File

@ -1031,9 +1031,14 @@ private NetworkStateTracker makeWimaxStateTracker() {
if ((ni.isConnectedOrConnecting() == true) &&
!network.isTeardownRequested()) {
if (ni.isConnected() == true) {
final long token = Binder.clearCallingIdentity();
try {
// add the pid-specific dns
handleDnsConfigurationChange(usedNetworkType);
if (VDBG) log("special network already active");
} finally {
Binder.restoreCallingIdentity(token);
}
return Phone.APN_ALREADY_ACTIVE;
}
if (VDBG) log("special network already connecting");
@ -1221,6 +1226,7 @@ private NetworkStateTracker makeWimaxStateTracker() {
}
if (!ConnectivityManager.isNetworkTypeValid(networkType)) {
if (DBG) log("requestRouteToHostAddress on invalid network: " + networkType);
return false;
}
NetworkStateTracker tracker = mNetTrackers[networkType];
@ -1233,11 +1239,16 @@ private NetworkStateTracker makeWimaxStateTracker() {
}
return false;
}
final long token = Binder.clearCallingIdentity();
try {
InetAddress addr = InetAddress.getByAddress(hostAddress);
LinkProperties lp = tracker.getLinkProperties();
return addRouteToAddress(lp, addr);
} catch (UnknownHostException e) {}
} catch (UnknownHostException e) {
if (DBG) log("requestRouteToHostAddress got " + e.toString());
} finally {
Binder.restoreCallingIdentity(token);
}
return false;
}
@ -1277,7 +1288,10 @@ private NetworkStateTracker makeWimaxStateTracker() {
private boolean modifyRoute(String ifaceName, LinkProperties lp, RouteInfo r, int cycleCount,
boolean doAdd, boolean toDefaultTable) {
if ((ifaceName == null) || (lp == null) || (r == null)) return false;
if ((ifaceName == null) || (lp == null) || (r == null)) {
if (DBG) log("modifyRoute got unexpected null: " + ifaceName + ", " + lp + ", " + r);
return false;
}
if (cycleCount > MAX_HOSTROUTE_CYCLE_COUNT) {
loge("Error modifying route - too much recursion");
@ -1309,7 +1323,7 @@ private NetworkStateTracker makeWimaxStateTracker() {
}
} catch (Exception e) {
// never crash - catch them all
if (VDBG) loge("Exception trying to add a route: " + e);
if (DBG) loge("Exception trying to add a route: " + e);
return false;
}
} else {
@ -1323,7 +1337,7 @@ private NetworkStateTracker makeWimaxStateTracker() {
mNetd.removeRoute(ifaceName, r);
} catch (Exception e) {
// never crash - catch them all
if (VDBG) loge("Exception trying to remove a route: " + e);
if (DBG) loge("Exception trying to remove a route: " + e);
return false;
}
} else {
@ -1335,7 +1349,7 @@ private NetworkStateTracker makeWimaxStateTracker() {
mNetd.removeSecondaryRoute(ifaceName, r);
} catch (Exception e) {
// never crash - catch them all
if (VDBG) loge("Exception trying to remove a route: " + e);
if (DBG) loge("Exception trying to remove a route: " + e);
return false;
}
}
@ -2004,7 +2018,7 @@ private NetworkStateTracker makeWimaxStateTracker() {
mNetd.removeRoute(ifaceName, r);
} catch (Exception e) {
// never crash - catch them all
if (VDBG) loge("Exception trying to remove a route: " + e);
if (DBG) loge("Exception trying to remove a route: " + e);
}
}
}
@ -2218,7 +2232,7 @@ private NetworkStateTracker makeWimaxStateTracker() {
mNetd.setDnsServersForInterface(iface, NetworkUtils.makeStrings(dnses));
mNetd.setDefaultInterfaceForDns(iface);
} catch (Exception e) {
if (VDBG) loge("exception setting default dns interface: " + e);
if (DBG) loge("exception setting default dns interface: " + e);
}
}
if (!domains.equals(SystemProperties.get("net.dns.search"))) {
@ -2248,7 +2262,7 @@ private NetworkStateTracker makeWimaxStateTracker() {
mNetd.setDnsServersForInterface(p.getInterfaceName(),
NetworkUtils.makeStrings(dnses));
} catch (Exception e) {
if (VDBG) loge("exception setting dns servers: " + e);
if (DBG) loge("exception setting dns servers: " + e);
}
// set per-pid dns for attached secondary nets
List pids = mNetRequestersPids[netType];

View File

@ -68,6 +68,8 @@ public abstract class DataConnection extends StateMachine {
private List<ApnContext> mApnList = null;
PendingIntent mReconnectIntent = null;
private DataConnectionTracker mDataConnectionTracker = null;
/**
* Used internally for saving connecting parameters.
*/
@ -202,6 +204,7 @@ public abstract class DataConnection extends StateMachine {
protected static final int EVENT_DEACTIVATE_DONE = BASE + 3;
protected static final int EVENT_DISCONNECT = BASE + 4;
protected static final int EVENT_RIL_CONNECTED = BASE + 5;
protected static final int EVENT_DISCONNECT_ALL = BASE + 6;
//***** Tag IDs for EventLog
protected static final int EVENT_LOG_BAD_DNS_ADDRESS = 50100;
@ -234,10 +237,12 @@ public abstract class DataConnection extends StateMachine {
//***** Constructor
protected DataConnection(PhoneBase phone, String name, int id, RetryManager rm) {
protected DataConnection(PhoneBase phone, String name, int id, RetryManager rm,
DataConnectionTracker dct) {
super(name);
if (DBG) log("DataConnection constructor E");
this.phone = phone;
this.mDataConnectionTracker = dct;
mId = id;
mRetryMgr = rm;
this.cid = -1;
@ -316,11 +321,19 @@ public abstract class DataConnection extends StateMachine {
*
* @param dp is the DisconnectParams.
*/
private void notifyDisconnectCompleted(DisconnectParams dp) {
private void notifyDisconnectCompleted(DisconnectParams dp, boolean sendAll) {
if (VDBG) log("NotifyDisconnectCompleted");
ApnContext alreadySent = null;
String reason = null;
if (dp.onCompletedMsg != null) {
// Get ApnContext, but only valid on GSM devices this is a string on CDMA devices.
Message msg = dp.onCompletedMsg;
if (msg.obj instanceof ApnContext) {
alreadySent = (ApnContext)msg.obj;
}
reason = dp.reason;
if (VDBG) {
log(String.format("msg=%s msg.obj=%s", msg.toString(),
((msg.obj instanceof String) ? (String) msg.obj : "<no-reason>")));
@ -328,6 +341,17 @@ public abstract class DataConnection extends StateMachine {
AsyncResult.forMessage(msg);
msg.sendToTarget();
}
if (sendAll) {
for (ApnContext a : mApnList) {
if (a == alreadySent) continue;
if (reason != null) a.setReason(reason);
Message msg = mDataConnectionTracker.obtainMessage(
DataConnectionTracker.EVENT_DISCONNECT_DONE, a);
AsyncResult.forMessage(msg);
msg.sendToTarget();
}
}
if (DBG) log("NotifyDisconnectCompleted DisconnectParams=" + dp);
}
@ -706,6 +730,13 @@ public abstract class DataConnection extends StateMachine {
deferMessage(msg);
break;
case EVENT_DISCONNECT_ALL:
if (DBG) {
log("DcDefaultState deferring msg.what=EVENT_DISCONNECT_ALL" + mRefCount);
}
deferMessage(msg);
break;
case EVENT_RIL_CONNECTED:
ar = (AsyncResult)msg.obj;
if (ar.exception == null) {
@ -771,7 +802,7 @@ public abstract class DataConnection extends StateMachine {
}
if (mDisconnectParams != null) {
if (VDBG) log("DcInactiveState: enter notifyDisconnectCompleted");
notifyDisconnectCompleted(mDisconnectParams);
notifyDisconnectCompleted(mDisconnectParams, true);
}
clearSettings();
}
@ -812,7 +843,13 @@ public abstract class DataConnection extends StateMachine {
case EVENT_DISCONNECT:
if (DBG) log("DcInactiveState: msg.what=EVENT_DISCONNECT");
notifyDisconnectCompleted((DisconnectParams)msg.obj);
notifyDisconnectCompleted((DisconnectParams)msg.obj, false);
retVal = HANDLED;
break;
case EVENT_DISCONNECT_ALL:
if (DBG) log("DcInactiveState: msg.what=EVENT_DISCONNECT_ALL");
notifyDisconnectCompleted((DisconnectParams)msg.obj, false);
retVal = HANDLED;
break;
@ -989,12 +1026,24 @@ public abstract class DataConnection extends StateMachine {
transitionTo(mDisconnectingState);
} else {
if (msg.obj != null) {
notifyDisconnectCompleted((DisconnectParams) msg.obj);
notifyDisconnectCompleted((DisconnectParams) msg.obj, false);
}
}
retVal = HANDLED;
break;
case EVENT_DISCONNECT_ALL:
if (DBG) {
log("DcActiveState msg.what=EVENT_DISCONNECT_ALL RefCount=" + mRefCount);
}
mRefCount = 0;
DisconnectParams dp = (DisconnectParams) msg.obj;
dp.tag = mTag;
tearDownData(dp);
transitionTo(mDisconnectingState);
retVal = HANDLED;
break;
default:
if (VDBG) {
log("DcActiveState not handled msg.what=0x" +
@ -1124,4 +1173,16 @@ public abstract class DataConnection extends StateMachine {
public void tearDown(String reason, Message onCompletedMsg) {
sendMessage(obtainMessage(EVENT_DISCONNECT, new DisconnectParams(reason, onCompletedMsg)));
}
/**
* Tear down the connection through the apn on the network. Ignores refcount and
* and always tears down.
*
* @param onCompletedMsg is sent with its msg.obj as an AsyncResult object.
* With AsyncResult.userObj set to the original msg.obj.
*/
public void tearDownAll(String reason, Message onCompletedMsg) {
sendMessage(obtainMessage(EVENT_DISCONNECT_ALL,
new DisconnectParams(reason, onCompletedMsg)));
}
}

View File

@ -1030,7 +1030,8 @@ public abstract class DataConnectionTracker extends Handler {
}
}
if (didDisable) {
if (enabledCount == 0) {
if ((enabledCount == 0) || (apnId == APN_DUN_ID)) {
mRequestedApnType = Phone.APN_TYPE_DEFAULT;
onCleanUpConnection(true, apnId, Phone.REASON_DATA_DISABLED);
}

View File

@ -20,6 +20,7 @@ import android.os.Message;
import android.util.Log;
import com.android.internal.telephony.DataConnection;
import com.android.internal.telephony.DataConnectionTracker;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.RILConstants;
import com.android.internal.telephony.RetryManager;
@ -32,8 +33,9 @@ public class CdmaDataConnection extends DataConnection {
private static final String LOG_TAG = "CDMA";
// ***** Constructor
private CdmaDataConnection(CDMAPhone phone, String name, int id, RetryManager rm) {
super(phone, name, id, rm);
private CdmaDataConnection(CDMAPhone phone, String name, int id, RetryManager rm,
DataConnectionTracker dct) {
super(phone, name, id, rm, dct);
}
/**
@ -44,12 +46,13 @@ public class CdmaDataConnection extends DataConnection {
* @param rm the RetryManager
* @return CdmaDataConnection that was created.
*/
static CdmaDataConnection makeDataConnection(CDMAPhone phone, int id, RetryManager rm) {
static CdmaDataConnection makeDataConnection(CDMAPhone phone, int id, RetryManager rm,
DataConnectionTracker dct) {
synchronized (mCountLock) {
mCount += 1;
}
CdmaDataConnection cdmaDc = new CdmaDataConnection(phone, "CdmaDC-" + mCount,
id, rm);
id, rm, dct);
cdmaDc.start();
if (DBG) cdmaDc.log("Made " + cdmaDc.getName());
return cdmaDc;

View File

@ -140,7 +140,7 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
@Override
public void dispose() {
cleanUpConnection(false, null);
cleanUpConnection(false, null, false);
super.dispose();
@ -295,7 +295,7 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
* @param tearDown true if the underlying DataConnection should be disconnected.
* @param reason for the clean up.
*/
private void cleanUpConnection(boolean tearDown, String reason) {
private void cleanUpConnection(boolean tearDown, String reason, boolean doAll) {
if (DBG) log("cleanUpConnection: reason: " + reason);
// Clear the reconnect alarm, if set.
@ -315,9 +315,15 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
DataConnectionAc dcac =
mDataConnectionAsyncChannels.get(conn.getDataConnectionId());
if (tearDown) {
if (DBG) log("cleanUpConnection: teardown, call conn.disconnect");
if (doAll) {
if (DBG) log("cleanUpConnection: teardown, conn.tearDownAll");
conn.tearDownAll(reason, obtainMessage(EVENT_DISCONNECT_DONE,
conn.getDataConnectionId(), 0, reason));
} else {
if (DBG) log("cleanUpConnection: teardown, conn.tearDown");
conn.tearDown(reason, obtainMessage(EVENT_DISCONNECT_DONE,
conn.getDataConnectionId(), 0, reason));
}
notificationDeferred = true;
} else {
if (DBG) log("cleanUpConnection: !tearDown, call conn.resetSynchronously");
@ -599,7 +605,7 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
@Override
protected void onEnableNewApn() {
// No mRequestedApnType check; only one connection is supported
cleanUpConnection(true, Phone.REASON_APN_SWITCHED);
cleanUpConnection(true, Phone.REASON_APN_SWITCHED, false);
}
/**
@ -781,13 +787,13 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
@Override
protected void onCleanUpConnection(boolean tearDown, int apnId, String reason) {
// No apnId check; only one connection is supported
cleanUpConnection(tearDown, reason);
cleanUpConnection(tearDown, reason, (apnId == APN_DUN_ID));
}
@Override
protected void onCleanUpAllConnections(String cause) {
// Only one CDMA connection is supported
cleanUpConnection(true, cause);
cleanUpConnection(true, cause, false);
}
private void createAllDataConnectionList() {
@ -806,7 +812,7 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
}
int id = mUniqueIdGenerator.getAndIncrement();
dataConn = CdmaDataConnection.makeDataConnection(mCdmaPhone, id, rm);
dataConn = CdmaDataConnection.makeDataConnection(mCdmaPhone, id, rm, this);
mDataConnections.put(id, dataConn);
DataConnectionAc dcac = new DataConnectionAc(dataConn, LOG_TAG);
int status = dcac.fullyConnectSync(mPhone.getContext(), this, dataConn.getHandler());
@ -833,7 +839,7 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
notifyDataConnection(Phone.REASON_CDMA_DATA_DETACHED);
} else {
if (mState == State.FAILED) {
cleanUpConnection(false, Phone.REASON_CDMA_DATA_DETACHED);
cleanUpConnection(false, Phone.REASON_CDMA_DATA_DETACHED, false);
mDataConnections.get(0).resetRetryCount();
CdmaCellLocation loc = (CdmaCellLocation)(mPhone.getCellLocation());
@ -912,7 +918,7 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
log("onDataStateChanged: No active connection"
+ "state is CONNECTED, disconnecting/cleanup");
writeEventLogCdmaDataDrop();
cleanUpConnection(true, null);
cleanUpConnection(true, null, false);
return;
}

View File

@ -22,6 +22,7 @@ import android.util.Patterns;
import android.text.TextUtils;
import com.android.internal.telephony.DataConnection;
import com.android.internal.telephony.DataConnectionTracker;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneBase;
import com.android.internal.telephony.RILConstants;
@ -38,8 +39,9 @@ public class GsmDataConnection extends DataConnection {
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);
private GsmDataConnection(PhoneBase phone, String name, int id, RetryManager rm,
DataConnectionTracker dct) {
super(phone, name, id, rm, dct);
}
/**
@ -50,11 +52,12 @@ public class GsmDataConnection extends DataConnection {
* @param rm the RetryManager
* @return GsmDataConnection that was created.
*/
static GsmDataConnection makeDataConnection(PhoneBase phone, int id, RetryManager rm) {
static GsmDataConnection makeDataConnection(PhoneBase phone, int id, RetryManager rm,
DataConnectionTracker dct) {
synchronized (mCountLock) {
mCount += 1;
}
GsmDataConnection gsmDc = new GsmDataConnection(phone, "GsmDC-" + mCount, id, rm);
GsmDataConnection gsmDc = new GsmDataConnection(phone, "GsmDC-" + mCount, id, rm, dct);
gsmDc.start();
if (DBG) gsmDc.log("Made " + gsmDc.getName());
return gsmDc;

View File

@ -850,9 +850,28 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
// Connection is still there. Try to clean up.
if (dcac != null) {
if (apnContext.getState() != State.DISCONNECTING) {
if (DBG) log("cleanUpConnection: tearing down");
boolean disconnectAll = false;
if (Phone.APN_TYPE_DUN.equals(apnContext.getApnType())) {
ApnSetting dunSetting = fetchDunApn();
if (dunSetting != null &&
dunSetting.equals(apnContext.getApnSetting())) {
if (DBG) log("tearing down dedicated DUN connection");
// we need to tear it down - we brought it up just for dun and
// other people are camped on it and now dun is done. We need
// to stop using it and let the normal apn list get used to find
// connections for the remaining desired connections
disconnectAll = true;
}
}
if (DBG) {
log("cleanUpConnection: tearing down" + (disconnectAll ? " all" :""));
}
Message msg = obtainMessage(EVENT_DISCONNECT_DONE, apnContext);
if (disconnectAll) {
apnContext.getDataConnection().tearDownAll(apnContext.getReason(), msg);
} else {
apnContext.getDataConnection().tearDown(apnContext.getReason(), msg);
}
apnContext.setState(State.DISCONNECTING);
}
} else {
@ -2213,7 +2232,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
RetryManager rm = new RetryManager();
int id = mUniqueIdGenerator.getAndIncrement();
GsmDataConnection conn = GsmDataConnection.makeDataConnection(mPhone, id, rm);
GsmDataConnection conn = GsmDataConnection.makeDataConnection(mPhone, id, rm, this);
mDataConnections.put(id, conn);
DataConnectionAc dcac = new DataConnectionAc(conn, LOG_TAG);
int status = dcac.fullyConnectSync(mPhone.getContext(), this, conn.getHandler());