Stop clat if it's no longer in use.

Normally, clatd is stopped when a connection disconnects.
However, if the connection's LinkProperties change, or if the
disconnect somehow gets lost (e.g., because of bug 8486114),
then we need to stop it (and possibly restart it).

Bug: 8276725
Change-Id: Ib8ad0d653ed8d0cd70b7414bcaa8fdaef8ba5fcc
This commit is contained in:
Lorenzo Colitti
2013-03-28 14:13:43 +09:00
parent aff5413507
commit 4118d082f1
2 changed files with 13 additions and 1 deletions

View File

@@ -2284,9 +2284,17 @@ public class ConnectivityService extends IConnectivityManager.Stub {
} }
// Update 464xlat state. // Update 464xlat state.
// TODO: Move to handleConnect()
NetworkStateTracker tracker = mNetTrackers[netType]; NetworkStateTracker tracker = mNetTrackers[netType];
if (mClat.requiresClat(netType, tracker)) { if (mClat.requiresClat(netType, tracker)) {
// If the connection was previously using clat, but is not using it now, stop the clat
// daemon. Normally, this happens automatically when the connection disconnects, but if
// the disconnect is not reported, or if the connection's LinkProperties changed for
// some other reason (e.g., handoff changes the IP addresses on the link), it would
// still be running. If it's not running, then stopping it is a no-op.
if (Nat464Xlat.isRunningClat(curLp) && !Nat464Xlat.isRunningClat(newLp)) {
mClat.stopClat();
}
// If the link requires clat to be running, then start the daemon now.
if (mNetTrackers[netType].getNetworkInfo().isConnected()) { if (mNetTrackers[netType].getNetworkInfo().isConnected()) {
mClat.startClat(tracker); mClat.startClat(tracker);
} else { } else {

View File

@@ -87,6 +87,10 @@ public class Nat464Xlat extends BaseNetworkObserver {
return netType == TYPE_MOBILE && !lp.hasIPv4Address(); return netType == TYPE_MOBILE && !lp.hasIPv4Address();
} }
public static boolean isRunningClat(LinkProperties lp) {
return lp != null && lp.getAllInterfaceNames().contains(CLAT_INTERFACE_NAME);
}
/** /**
* Starts the clat daemon. * Starts the clat daemon.
* @param lp The link properties of the interface to start clatd on. * @param lp The link properties of the interface to start clatd on.