Move transport parsing to EthernetTrackerConfig

Test: EthernetTrackerTest
Change-Id: I849ab478a101955c71e7881eb6609f5630a0062a
This commit is contained in:
Patrick Rohr 2025-03-20 09:22:48 -07:00
commit c28cd83cee
2 changed files with 69 additions and 37 deletions

View file

@ -18,6 +18,10 @@ package com.android.server.ethernet;
import static android.net.EthernetManager.ETHERNET_STATE_DISABLED;
import static android.net.EthernetManager.ETHERNET_STATE_ENABLED;
import static android.net.NetworkCapabilities.TRANSPORT_ETHERNET;
import static android.net.NetworkCapabilities.TRANSPORT_LOWPAN;
import static android.net.NetworkCapabilities.TRANSPORT_VPN;
import static android.net.NetworkCapabilities.TRANSPORT_WIFI_AWARE;
import static android.net.TestNetworkManager.TEST_TAP_PREFIX;
import static com.android.internal.annotations.VisibleForTesting.Visibility.PACKAGE;
@ -639,7 +643,7 @@ public class EthernetTracker {
nc = mNetworkCapabilities.get(hwAddress);
if (nc == null) {
final boolean isTestIface = iface.matches(TEST_IFACE_REGEXP);
nc = createDefaultNetworkCapabilities(isTestIface, /* overrideTransport */ null);
nc = createDefaultNetworkCapabilities(isTestIface, TRANSPORT_ETHERNET);
}
}
@ -780,9 +784,9 @@ public class EthernetTracker {
}
private static NetworkCapabilities createDefaultNetworkCapabilities(
boolean isTestIface, @Nullable String overrideTransport) {
boolean isTestIface, int transportType) {
NetworkCapabilities.Builder builder =
createNetworkCapabilities(/* commaSeparatedCapabilities */ null, overrideTransport)
createNetworkCapabilities(/* commaSeparatedCapabilities */ null, transportType)
.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING)
@ -811,7 +815,7 @@ public class EthernetTracker {
*/
@VisibleForTesting
static NetworkCapabilities.Builder createNetworkCapabilities(
@Nullable String commaSeparatedCapabilities, @Nullable String overrideTransport) {
@Nullable String commaSeparatedCapabilities, int transportType) {
final NetworkCapabilities.Builder builder =
TextUtils.isEmpty(commaSeparatedCapabilities)
@ -822,33 +826,7 @@ public class EthernetTracker {
// attempt to add it. Since we can only have one override, all errors with it will
// gracefully default back to TRANSPORT_ETHERNET and warn the user. VPN is not allowed as an
// override type. Wifi Aware and LoWPAN are currently unsupported as well.
int transport = NetworkCapabilities.TRANSPORT_ETHERNET;
if (!TextUtils.isEmpty(overrideTransport)) {
try {
int parsedTransport = Integer.valueOf(overrideTransport);
if (parsedTransport == NetworkCapabilities.TRANSPORT_VPN
|| parsedTransport == NetworkCapabilities.TRANSPORT_WIFI_AWARE
|| parsedTransport == NetworkCapabilities.TRANSPORT_LOWPAN) {
Log.e(TAG, "Override transport '" + parsedTransport + "' is not supported. "
+ "Defaulting to TRANSPORT_ETHERNET");
} else {
transport = parsedTransport;
}
} catch (NumberFormatException nfe) {
Log.e(TAG, "Override transport type '" + overrideTransport + "' "
+ "could not be parsed. Defaulting to TRANSPORT_ETHERNET");
}
}
// Apply the transport. If the user supplied a valid number that is not a valid transport
// then adding will throw an exception. Default back to TRANSPORT_ETHERNET if that happens
try {
builder.addTransportType(transport);
} catch (IllegalArgumentException iae) {
Log.e(TAG, transport + " is not a valid NetworkCapability.TRANSPORT_* value. "
+ "Defaulting to TRANSPORT_ETHERNET");
builder.addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET);
}
builder.addTransportType(transportType);
builder.setLinkUpstreamBandwidthKbps(100 * 1000);
builder.setLinkDownstreamBandwidthKbps(100 * 1000);
@ -1049,7 +1027,35 @@ public class EthernetTracker {
final String mIface;
final String mCapabilities;
final String mIpConfig;
final String mTransport;
final int mTransport;
private static int parseTransportType(String transportString) {
if (TextUtils.isEmpty(transportString)) {
return TRANSPORT_ETHERNET;
}
final int parsedTransport;
try {
parsedTransport = Integer.valueOf(transportString);
} catch (NumberFormatException e) {
Log.e(TAG, "Failed to parse transport type", e);
return TRANSPORT_ETHERNET;
}
if (!NetworkCapabilities.isValidTransport(parsedTransport)) {
return TRANSPORT_ETHERNET;
}
switch (parsedTransport) {
case TRANSPORT_VPN:
case TRANSPORT_WIFI_AWARE:
case TRANSPORT_LOWPAN:
Log.e(TAG, "Unsupported transport type '" + parsedTransport + "'");
return TRANSPORT_ETHERNET;
default:
return parsedTransport;
}
}
EthernetTrackerConfig(String configString) {
Objects.requireNonNull(configString, "EthernetTrackerConfig requires non-null config");
@ -1057,7 +1063,7 @@ public class EthernetTracker {
mIface = tokens[0];
mCapabilities = tokens.length > 1 ? tokens[1] : null;
mIpConfig = tokens.length > 2 && !TextUtils.isEmpty(tokens[2]) ? tokens[2] : null;
mTransport = tokens.length > 3 ? tokens[3] : null;
mTransport = tokens.length > 3 ? parseTransportType(tokens[3]) : TRANSPORT_ETHERNET;
}
}
}

View file

@ -284,11 +284,15 @@ public class EthernetTrackerTest {
private void assertParsedNetworkCapabilities(
NetworkCapabilities expectedNetworkCapabilities,
String configCapabiltiies,
String configCapabilities,
String configTransports) {
final String ipConfig = "";
final String configString =
String.join(";", TEST_IFACE, configCapabilities, ipConfig, configTransports);
final EthernetTrackerConfig config = new EthernetTrackerConfig(configString);
assertEquals(
expectedNetworkCapabilities,
EthernetTracker.createNetworkCapabilities(configCapabiltiies, configTransports)
EthernetTracker.createNetworkCapabilities(config.mCapabilities, config.mTransport)
.build());
}
@ -296,7 +300,7 @@ public class EthernetTrackerTest {
public void testCreateEthernetTrackerConfigReturnsCorrectValue() {
final String capabilities = "2";
final String ipConfig = "3";
final String transport = "4";
final String transport = "1";
final String configString = String.join(";", TEST_IFACE, capabilities, ipConfig, transport);
final EthernetTrackerConfig config = new EthernetTrackerConfig(configString);
@ -304,7 +308,29 @@ public class EthernetTrackerTest {
assertEquals(TEST_IFACE, config.mIface);
assertEquals(capabilities, config.mCapabilities);
assertEquals(ipConfig, config.mIpConfig);
assertEquals(transport, config.mTransport);
assertEquals(NetworkCapabilities.TRANSPORT_WIFI, config.mTransport);
}
@Test
public void testCreateEthernetTrackerConfig_withInvalidTransport() {
final String capabilities = "2";
final String ipConfig = "3";
final String transport = "100"; // Invalid transport type
final String configString = String.join(";", TEST_IFACE, capabilities, ipConfig, transport);
final EthernetTrackerConfig config = new EthernetTrackerConfig(configString);
assertEquals(NetworkCapabilities.TRANSPORT_ETHERNET, config.mTransport);
}
@Test
public void testCreateEthernetTrackerConfig_withDisallowedTransport() {
final String capabilities = "2";
final String ipConfig = "3";
final String transport = "4"; // TRANSPORT_VPN is not allowed
final String configString = String.join(";", TEST_IFACE, capabilities, ipConfig, transport);
final EthernetTrackerConfig config = new EthernetTrackerConfig(configString);
assertEquals(NetworkCapabilities.TRANSPORT_ETHERNET, config.mTransport);
}
@Test