Merge "Also support 464xlat on SUSPENDED networks"

am: 995a28d334

Change-Id: Iab87bfcb66e7932d61beec38bcbda366262eab46
This commit is contained in:
Erik Kline
2017-09-21 11:55:35 +00:00
committed by android-build-merger
3 changed files with 38 additions and 9 deletions

View File

@@ -130,7 +130,6 @@ import com.android.server.connectivity.DataConnectionStats;
import com.android.server.connectivity.KeepaliveTracker; import com.android.server.connectivity.KeepaliveTracker;
import com.android.server.connectivity.LingerMonitor; import com.android.server.connectivity.LingerMonitor;
import com.android.server.connectivity.MockableSystemProperties; import com.android.server.connectivity.MockableSystemProperties;
import com.android.server.connectivity.Nat464Xlat;
import com.android.server.connectivity.NetworkAgentInfo; import com.android.server.connectivity.NetworkAgentInfo;
import com.android.server.connectivity.NetworkDiagnostics; import com.android.server.connectivity.NetworkDiagnostics;
import com.android.server.connectivity.NetworkMonitor; import com.android.server.connectivity.NetworkMonitor;

View File

@@ -20,6 +20,7 @@ import android.net.InterfaceConfiguration;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.LinkAddress; import android.net.LinkAddress;
import android.net.LinkProperties; import android.net.LinkProperties;
import android.net.NetworkInfo;
import android.net.RouteInfo; import android.net.RouteInfo;
import android.os.INetworkManagementService; import android.os.INetworkManagementService;
import android.os.RemoteException; import android.os.RemoteException;
@@ -44,12 +45,18 @@ public class Nat464Xlat extends BaseNetworkObserver {
// This must match the interface prefix in clatd.c. // This must match the interface prefix in clatd.c.
private static final String CLAT_PREFIX = "v4-"; private static final String CLAT_PREFIX = "v4-";
// The network types we will start clatd on, // The network types on which we will start clatd,
// allowing clat only on networks for which we can support IPv6-only. // allowing clat only on networks for which we can support IPv6-only.
private static final int[] NETWORK_TYPES = { private static final int[] NETWORK_TYPES = {
ConnectivityManager.TYPE_MOBILE, ConnectivityManager.TYPE_MOBILE,
ConnectivityManager.TYPE_WIFI, ConnectivityManager.TYPE_WIFI,
ConnectivityManager.TYPE_ETHERNET, ConnectivityManager.TYPE_ETHERNET,
};
// The network states in which running clatd is supported.
private static final NetworkInfo.State[] NETWORK_STATES = {
NetworkInfo.State.CONNECTED,
NetworkInfo.State.SUSPENDED,
}; };
private final INetworkManagementService mNMService; private final INetworkManagementService mNMService;
@@ -81,11 +88,8 @@ public class Nat464Xlat extends BaseNetworkObserver {
*/ */
public static boolean requiresClat(NetworkAgentInfo nai) { public static boolean requiresClat(NetworkAgentInfo nai) {
// TODO: migrate to NetworkCapabilities.TRANSPORT_*. // TODO: migrate to NetworkCapabilities.TRANSPORT_*.
final int netType = nai.networkInfo.getType();
final boolean supported = ArrayUtils.contains(NETWORK_TYPES, nai.networkInfo.getType()); final boolean supported = ArrayUtils.contains(NETWORK_TYPES, nai.networkInfo.getType());
// TODO: this should also consider if the network is in SUSPENDED state to avoid stopping final boolean connected = ArrayUtils.contains(NETWORK_STATES, nai.networkInfo.getState());
// clatd in SUSPENDED state.
final boolean connected = nai.networkInfo.isConnected();
// We only run clat on networks that don't have a native IPv4 address. // We only run clat on networks that don't have a native IPv4 address.
final boolean hasIPv4Address = final boolean hasIPv4Address =
(nai.linkProperties != null) && nai.linkProperties.hasIPv4Address(); (nai.linkProperties != null) && nai.linkProperties.hasIPv4Address();

View File

@@ -84,6 +84,32 @@ public class Nat464XlatTest {
when(mConfig.getLinkAddress()).thenReturn(ADDR); when(mConfig.getLinkAddress()).thenReturn(ADDR);
} }
@Test
public void testRequiresClat() throws Exception {
final int[] supportedTypes = {
ConnectivityManager.TYPE_MOBILE,
ConnectivityManager.TYPE_WIFI,
ConnectivityManager.TYPE_ETHERNET,
};
// NetworkInfo doesn't allow setting the State directly, but rather
// requires setting DetailedState in order set State as a side-effect.
final NetworkInfo.DetailedState[] supportedDetailedStates = {
NetworkInfo.DetailedState.CONNECTED,
NetworkInfo.DetailedState.SUSPENDED,
};
for (int type : supportedTypes) {
mNai.networkInfo.setType(type);
for (NetworkInfo.DetailedState state : supportedDetailedStates) {
mNai.networkInfo.setDetailedState(state, "reason", "extraInfo");
assertTrue(
String.format("requiresClat expected for type=%d state=%s", type, state),
Nat464Xlat.requiresClat(mNai));
}
}
}
@Test @Test
public void testNormalStartAndStop() throws Exception { public void testNormalStartAndStop() throws Exception {
Nat464Xlat nat = makeNat464Xlat(); Nat464Xlat nat = makeNat464Xlat();