Merge "Stop using shared DUN APN when tethering stops."

This commit is contained in:
Robert Greenwalt
2012-01-20 14:35:41 -08:00
committed by Android (Google) Code Review
6 changed files with 125 additions and 28 deletions

View File

@@ -1031,9 +1031,14 @@ private NetworkStateTracker makeWimaxStateTracker() {
if ((ni.isConnectedOrConnecting() == true) &&
!network.isTeardownRequested()) {
if (ni.isConnected() == true) {
// add the pid-specific dns
handleDnsConfigurationChange(usedNetworkType);
if (VDBG) log("special network already active");
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,16 @@ 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) {
Message msg = dp.onCompletedMsg;
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 +338,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 +727,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 +799,7 @@ public abstract class DataConnection extends StateMachine {
}
if (mDisconnectParams != null) {
if (VDBG) log("DcInactiveState: enter notifyDisconnectCompleted");
notifyDisconnectCompleted(mDisconnectParams);
notifyDisconnectCompleted(mDisconnectParams, true);
}
clearSettings();
}
@@ -812,7 +840,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 +1023,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 +1170,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

@@ -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

@@ -794,7 +794,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());

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;
@@ -37,8 +38,9 @@ public class GsmDataConnection extends DataConnection {
//***** Instance Variables
protected int mProfileId = RILConstants.DATA_PROFILE_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);
}
/**
@@ -49,11 +51,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);
apnContext.getDataConnection().tearDown(apnContext.getReason(), msg);
if (disconnectAll) {
apnContext.getDataConnection().tearDownAll(apnContext.getReason(), msg);
} else {
apnContext.getDataConnection().tearDown(apnContext.getReason(), msg);
}
apnContext.setState(State.DISCONNECTING);
}
} else {
@@ -2228,7 +2247,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());