diff --git a/service-t/src/com/android/server/ethernet/EthernetTracker.java b/service-t/src/com/android/server/ethernet/EthernetTracker.java index e656eb9f1e..382350f9be 100644 --- a/service-t/src/com/android/server/ethernet/EthernetTracker.java +++ b/service-t/src/com/android/server/ethernet/EthernetTracker.java @@ -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; } } } diff --git a/tests/unit/java/com/android/server/ethernet/EthernetTrackerTest.java b/tests/unit/java/com/android/server/ethernet/EthernetTrackerTest.java index db7b37bfce..ef60f2a987 100644 --- a/tests/unit/java/com/android/server/ethernet/EthernetTrackerTest.java +++ b/tests/unit/java/com/android/server/ethernet/EthernetTrackerTest.java @@ -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