Get clatd/Nat464Xlat working with new NetworkAgents.

Change-Id: I65dfb59ce519a42bdb872940d229039b5403fd92
This commit is contained in:
Paul Jensen
2014-05-13 11:44:01 -04:00
committed by Lorenzo Colitti
parent 52f1e4631e
commit 3927e336e7
2 changed files with 61 additions and 47 deletions

View File

@@ -2486,26 +2486,6 @@ public class ConnectivityService extends IConnectivityManager.Stub {
}
}
// Update 464xlat state.
NetworkStateTracker tracker = mNetTrackers[netType];
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()) {
mClat.startClat(tracker);
} else {
mClat.stopClat();
}
}
// TODO: Temporary notifying upstread change to Tethering.
// @see bug/4455071
/** Notify TetheringService if interface name has been changed. */
@@ -3073,7 +3053,8 @@ public class ConnectivityService extends IConnectivityManager.Stub {
}
notifyNetworkCallbacks(nai, NetworkCallbacks.LOST);
nai.networkMonitor.sendMessage(NetworkMonitor.CMD_NETWORK_DISCONNECTED);
mNetworkAgentInfos.remove(nai);
mNetworkAgentInfos.remove(msg.replyTo);
updateClat(null, nai.linkProperties, nai);
// Since we've lost the network, go through all the requests that
// it was satisfying and see if any other factory can satisfy them.
final ArrayList<NetworkAgentInfo> toActivate = new ArrayList<NetworkAgentInfo>();
@@ -5121,6 +5102,28 @@ public class ConnectivityService extends IConnectivityManager.Stub {
// }
updateRoutes(newLp, oldLp, netId);
updateDnses(newLp, oldLp, netId);
updateClat(newLp, oldLp, networkAgent);
}
private void updateClat(LinkProperties newLp, LinkProperties oldLp, NetworkAgentInfo na) {
// Update 464xlat state.
if (mClat.requiresClat(na)) {
// 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(oldLp) && !Nat464Xlat.isRunningClat(newLp)) {
mClat.stopClat();
}
// If the link requires clat to be running, then start the daemon now.
if (newLp != null && na.networkInfo.isConnected()) {
mClat.startClat(na);
} else {
mClat.stopClat();
}
}
}
private void updateInterfaces(LinkProperties newLp, LinkProperties oldLp, int netId) {

View File

@@ -25,11 +25,12 @@ import android.net.IConnectivityManager;
import android.net.InterfaceConfiguration;
import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.NetworkStateTracker;
import android.net.NetworkAgent;
import android.net.NetworkUtils;
import android.net.RouteInfo;
import android.os.Handler;
import android.os.Message;
import android.os.Messenger;
import android.os.INetworkManagementService;
import android.os.RemoteException;
import android.util.Slog;
@@ -45,15 +46,18 @@ public class Nat464Xlat extends BaseNetworkObserver {
private Context mContext;
private INetworkManagementService mNMService;
private IConnectivityManager mConnService;
private NetworkStateTracker mTracker;
private Handler mHandler;
// Whether we started clatd and expect it to be running.
private boolean mIsStarted;
// Whether the clatd interface exists (i.e., clatd is running).
private boolean mIsRunning;
// The LinkProperties of the clat interface.
private LinkProperties mLP;
// Current LinkProperties of the network. Includes mLP as a stacked link when clat is active.
private LinkProperties mBaseLP;
// ConnectivityService Handler for LinkProperties updates.
private Handler mHandler;
// Marker to connote which network we're augmenting.
private Messenger mNetworkMessenger;
// This must match the interface name in clatd.conf.
private static final String CLAT_INTERFACE_NAME = "clat4";
@@ -73,14 +77,13 @@ public class Nat464Xlat extends BaseNetworkObserver {
}
/**
* Determines whether an interface requires clat.
* @param netType the network type (one of the
* android.net.ConnectivityManager.TYPE_* constants)
* @param tracker the NetworkStateTracker corresponding to the network type.
* @return true if the interface requires clat, false otherwise.
* Determines whether a network requires clat.
* @param network the NetworkAgentInfo corresponding to the network.
* @return true if the network requires clat, false otherwise.
*/
public boolean requiresClat(int netType, NetworkStateTracker tracker) {
LinkProperties lp = tracker.getLinkProperties();
public boolean requiresClat(NetworkAgentInfo network) {
int netType = network.networkInfo.getType();
LinkProperties lp = network.linkProperties;
// Only support clat on mobile for now.
Slog.d(TAG, "requiresClat: netType=" + netType + ", hasIPv4Address=" +
lp.hasIPv4Address());
@@ -95,13 +98,18 @@ public class Nat464Xlat extends BaseNetworkObserver {
* Starts the clat daemon.
* @param lp The link properties of the interface to start clatd on.
*/
public void startClat(NetworkStateTracker tracker) {
public void startClat(NetworkAgentInfo network) {
if (mNetworkMessenger != null && mNetworkMessenger != network.messenger) {
Slog.e(TAG, "startClat: too many networks requesting clat");
return;
}
mNetworkMessenger = network.messenger;
LinkProperties lp = network.linkProperties;
mBaseLP = new LinkProperties(lp);
if (mIsStarted) {
Slog.e(TAG, "startClat: already started");
return;
}
mTracker = tracker;
LinkProperties lp = mTracker.getLinkProperties();
String iface = lp.getInterfaceName();
Slog.i(TAG, "Starting clatd on " + iface + ", lp=" + lp);
try {
@@ -125,7 +133,8 @@ public class Nat464Xlat extends BaseNetworkObserver {
}
mIsStarted = false;
mIsRunning = false;
mTracker = null;
mNetworkMessenger = null;
mBaseLP = null;
mLP.clear();
} else {
Slog.e(TAG, "stopClat: already stopped");
@@ -140,6 +149,14 @@ public class Nat464Xlat extends BaseNetworkObserver {
return mIsRunning;
}
private void updateConnectivityService() {
Message msg = mHandler.obtainMessage(
NetworkAgent.EVENT_NETWORK_PROPERTIES_CHANGED, mBaseLP);
msg.replyTo = mNetworkMessenger;
Slog.i(TAG, "sending message to ConnectivityService: " + msg);
msg.sendToTarget();
}
@Override
public void interfaceAdded(String iface) {
if (iface.equals(CLAT_INTERFACE_NAME)) {
@@ -165,19 +182,12 @@ public class Nat464Xlat extends BaseNetworkObserver {
clatAddress.getAddress(), iface);
mLP.addRoute(ipv4Default);
mLP.addLinkAddress(clatAddress);
mTracker.addStackedLink(mLP);
Slog.i(TAG, "Adding stacked link. tracker LP: " +
mTracker.getLinkProperties());
mBaseLP.addStackedLink(mLP);
Slog.i(TAG, "Adding stacked link. tracker LP: " + mBaseLP);
updateConnectivityService();
} catch(RemoteException e) {
Slog.e(TAG, "Error getting link properties: " + e);
}
// Inform ConnectivityService that things have changed.
Message msg = mHandler.obtainMessage(
NetworkStateTracker.EVENT_CONFIGURATION_CHANGED,
mTracker.getNetworkInfo());
Slog.i(TAG, "sending message to ConnectivityService: " + msg);
msg.sendToTarget();
}
}
@@ -192,8 +202,9 @@ public class Nat464Xlat extends BaseNetworkObserver {
Slog.i(TAG, "interface " + CLAT_INTERFACE_NAME +
" removed, mIsRunning = " + mIsRunning + " -> false");
mIsRunning = false;
mTracker.removeStackedLink(mLP);
mBaseLP.removeStackedLink(mLP);
mLP.clear();
updateConnectivityService();
Slog.i(TAG, "mLP = " + mLP);
}
}