Make Ethernet interfaces more testable.

This CL adds a setIncludeTestInterfaces method to EthernetManager
that, when called, causes the Ethernet service to recognize and
manage test interfaces created by TestNetworkManager.

Bug: 150644681
Test: Tested by EthernetTetheringTest in same topic
Change-Id: I86eef7a93267f800dbfc8eafd307effa76a344ca
This commit is contained in:
Lorenzo Colitti
2020-03-17 00:11:37 +09:00
parent dceced7bca
commit 841195a103
2 changed files with 38 additions and 7 deletions

View File

@@ -163,15 +163,24 @@ public class EthernetServiceImpl extends IEthernetManager.Stub {
mTracker.removeListener(listener); mTracker.removeListener(listener);
} }
@Override
public void setIncludeTestInterfaces(boolean include) {
NetworkStack.checkNetworkStackPermissionOr(mContext,
android.Manifest.permission.NETWORK_SETTINGS);
mTracker.setIncludeTestInterfaces(include);
}
@Override @Override
public void requestTetheredInterface(ITetheredInterfaceCallback callback) { public void requestTetheredInterface(ITetheredInterfaceCallback callback) {
NetworkStack.checkNetworkStackPermission(mContext); NetworkStack.checkNetworkStackPermissionOr(mContext,
android.Manifest.permission.NETWORK_SETTINGS);
mTracker.requestTetheredInterface(callback); mTracker.requestTetheredInterface(callback);
} }
@Override @Override
public void releaseTetheredInterface(ITetheredInterfaceCallback callback) { public void releaseTetheredInterface(ITetheredInterfaceCallback callback) {
NetworkStack.checkNetworkStackPermission(mContext); NetworkStack.checkNetworkStackPermissionOr(mContext,
android.Manifest.permission.NETWORK_SETTINGS);
mTracker.releaseTetheredInterface(callback); mTracker.releaseTetheredInterface(callback);
} }

View File

@@ -16,6 +16,8 @@
package com.android.server.ethernet; package com.android.server.ethernet;
import static android.net.TestNetworkManager.TEST_TAP_PREFIX;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.content.Context; import android.content.Context;
import android.net.IEthernetServiceListener; import android.net.IEthernetServiceListener;
@@ -68,8 +70,12 @@ final class EthernetTracker {
private final static String TAG = EthernetTracker.class.getSimpleName(); private final static String TAG = EthernetTracker.class.getSimpleName();
private final static boolean DBG = EthernetNetworkFactory.DBG; private final static boolean DBG = EthernetNetworkFactory.DBG;
/** Product-dependent regular expression of interface names we track. */ /**
private final String mIfaceMatch; * Interface names we track. This is a product-dependent regular expression, plus,
* if setIncludeTestInterfaces is true, any test interfaces.
*/
private String mIfaceMatch;
private boolean mIncludeTestInterfaces = false;
/** Mapping between {iface name | mac address} -> {NetworkCapabilities} */ /** Mapping between {iface name | mac address} -> {NetworkCapabilities} */
private final ConcurrentHashMap<String, NetworkCapabilities> mNetworkCapabilities = private final ConcurrentHashMap<String, NetworkCapabilities> mNetworkCapabilities =
@@ -111,8 +117,7 @@ final class EthernetTracker {
mNMService = INetworkManagementService.Stub.asInterface(b); mNMService = INetworkManagementService.Stub.asInterface(b);
// Interface match regex. // Interface match regex.
mIfaceMatch = context.getResources().getString( updateIfaceMatchRegexp();
com.android.internal.R.string.config_ethernet_iface_regex);
// Read default Ethernet interface configuration from resources // Read default Ethernet interface configuration from resources
final String[] interfaceConfigs = context.getResources().getStringArray( final String[] interfaceConfigs = context.getResources().getStringArray(
@@ -187,6 +192,12 @@ final class EthernetTracker {
mListeners.unregister(listener); mListeners.unregister(listener);
} }
public void setIncludeTestInterfaces(boolean include) {
mIncludeTestInterfaces = include;
updateIfaceMatchRegexp();
trackAvailableInterfaces();
}
public void requestTetheredInterface(ITetheredInterfaceCallback callback) { public void requestTetheredInterface(ITetheredInterfaceCallback callback) {
mHandler.post(() -> { mHandler.post(() -> {
if (!mTetheredInterfaceRequests.register(callback)) { if (!mTetheredInterfaceRequests.register(callback)) {
@@ -348,7 +359,8 @@ final class EthernetTracker {
if (DBG) Log.i(TAG, "maybeTrackInterface " + iface); if (DBG) Log.i(TAG, "maybeTrackInterface " + iface);
// If we don't already track this interface, and if this interface matches // If we don't already track this interface, and if this interface matches
// our regex, start tracking it. // our regex, start tracking it.
if (!iface.matches(mIfaceMatch) || mFactory.hasInterface(iface)) { if (!iface.matches(mIfaceMatch) || mFactory.hasInterface(iface)
|| iface.equals(mDefaultInterface)) {
return; return;
} }
@@ -572,6 +584,16 @@ final class EthernetTracker {
return new IpConfiguration(IpAssignment.DHCP, ProxySettings.NONE, null, null); return new IpConfiguration(IpAssignment.DHCP, ProxySettings.NONE, null, null);
} }
private void updateIfaceMatchRegexp() {
final String testInterfaceMatch = TEST_TAP_PREFIX + ".*";
final String match = mContext.getResources().getString(
com.android.internal.R.string.config_ethernet_iface_regex);
mIfaceMatch = mIncludeTestInterfaces
? "(" + match + "|" + TEST_TAP_PREFIX + "\\d+)"
: match;
Log.d(TAG, "Interface match regexp set to '" + mIfaceMatch + "'");
}
private void postAndWaitForRunnable(Runnable r) { private void postAndWaitForRunnable(Runnable r) {
mHandler.runWithScissors(r, 2000L /* timeout */); mHandler.runWithScissors(r, 2000L /* timeout */);
} }