From 1ad35a97816d31bc70a22d3c4dd95d4edef96457 Mon Sep 17 00:00:00 2001 From: Patrick Rohr Date: Tue, 14 May 2024 14:49:10 +0000 Subject: [PATCH] Revert "Allow MAC addresses to configure IP configurations" This reverts commit dbbada4d7bdc48f3c2ec9981b3716662a5a2d5f8. Reason for revert: b/340396162 Change-Id: I2be4a5f2e53f98749eef39a9940118ee03dd3f18 --- .../server/ethernet/EthernetServiceImpl.java | 6 +- .../server/ethernet/EthernetTracker.java | 132 +++++++----------- 2 files changed, 48 insertions(+), 90 deletions(-) diff --git a/service-t/src/com/android/server/ethernet/EthernetServiceImpl.java b/service-t/src/com/android/server/ethernet/EthernetServiceImpl.java index 92f19531fb..b8689d6f17 100644 --- a/service-t/src/com/android/server/ethernet/EthernetServiceImpl.java +++ b/service-t/src/com/android/server/ethernet/EthernetServiceImpl.java @@ -108,11 +108,7 @@ public class EthernetServiceImpl extends IEthernetManager.Stub { PermissionUtils.enforceRestrictedNetworkPermission(mContext, TAG); } - // This causes thread-unsafe access on mIpConfigurations which might - // race with calls to EthernetManager#updateConfiguration(). - // EthernetManager#getConfiguration() has been marked as - // @UnsupportedAppUsage since Android R. - return mTracker.getIpConfiguration(iface); + return new IpConfiguration(mTracker.getIpConfiguration(iface)); } /** diff --git a/service-t/src/com/android/server/ethernet/EthernetTracker.java b/service-t/src/com/android/server/ethernet/EthernetTracker.java index a60592fac2..71f289e5c2 100644 --- a/service-t/src/com/android/server/ethernet/EthernetTracker.java +++ b/service-t/src/com/android/server/ethernet/EthernetTracker.java @@ -31,6 +31,8 @@ import android.net.INetd; import android.net.ITetheredInterfaceCallback; import android.net.InterfaceConfigurationParcel; import android.net.IpConfiguration; +import android.net.IpConfiguration.IpAssignment; +import android.net.IpConfiguration.ProxySettings; import android.net.LinkAddress; import android.net.NetworkCapabilities; import android.net.StaticIpConfiguration; @@ -109,7 +111,6 @@ public class EthernetTracker { /** Mapping between {iface name | mac address} -> {NetworkCapabilities} */ private final ConcurrentHashMap mNetworkCapabilities = new ConcurrentHashMap<>(); - /** Mapping between {iface name | mac address} -> {IpConfiguration} */ private final ConcurrentHashMap mIpConfigurations = new ConcurrentHashMap<>(); @@ -297,7 +298,7 @@ public class EthernetTracker { } private IpConfiguration getIpConfigurationForCallback(String iface, int state) { - return (state == EthernetManager.STATE_ABSENT) ? null : getIpConfiguration(iface); + return (state == EthernetManager.STATE_ABSENT) ? null : getOrCreateIpConfiguration(iface); } private void ensureRunningOnEthernetServiceThread() { @@ -390,83 +391,8 @@ public class EthernetTracker { mHandler.post(() -> setInterfaceAdministrativeState(iface, enabled, cb)); } - private @Nullable String getHwAddress(String iface) { - if (getInterfaceRole(iface) == EthernetManager.ROLE_SERVER) { - return mTetheringInterfaceHwAddr; - } - - return mFactory.getHwAddress(iface); - } - - /** - * Get the IP configuration of the interface, or the default if the interface doesn't exist. - * @param iface the name of the interface to retrieve. - * - * @return The IP configuration - */ - public IpConfiguration getIpConfiguration(String iface) { - return getIpConfiguration(iface, getHwAddress(iface)); - } - - private IpConfiguration getIpConfiguration(String iface, @Nullable String hwAddress) { - // Look up Ip configuration first by ifname, then by MAC address. - IpConfiguration ipConfig = mIpConfigurations.get(iface); - if (ipConfig != null) { - return ipConfig; - } - - if (hwAddress == null) { - // should never happen. - Log.wtf(TAG, "No hardware address for interface " + iface); - } else { - ipConfig = mIpConfigurations.get(hwAddress); - } - - if (ipConfig == null) { - ipConfig = new IpConfiguration.Builder().build(); - } - - return ipConfig; - } - - private NetworkCapabilities getNetworkCapabilities(String iface) { - return getNetworkCapabilities(iface, getHwAddress(iface)); - } - - private NetworkCapabilities getNetworkCapabilities(String iface, @Nullable String hwAddress) { - // Look up network capabilities first by ifname, then by MAC address. - NetworkCapabilities networkCapabilities = mNetworkCapabilities.get(iface); - if (networkCapabilities != null) { - return networkCapabilities; - } - - if (hwAddress == null) { - // should never happen. - Log.wtf(TAG, "No hardware address for interface " + iface); - } else { - networkCapabilities = mNetworkCapabilities.get(hwAddress); - } - - if (networkCapabilities != null) { - return networkCapabilities; - } - - final NetworkCapabilities.Builder builder = createNetworkCapabilities( - false /* clear default capabilities */, null, null) - .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) - .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED) - .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING) - .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED) - .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED) - .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED); - - if (isValidTestInterface(iface)) { - builder.addTransportType(NetworkCapabilities.TRANSPORT_TEST); - } else { - builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); - } - - return builder.build(); + IpConfiguration getIpConfiguration(String iface) { + return mIpConfigurations.get(iface); } @VisibleForTesting(visibility = PACKAGE) @@ -507,8 +433,8 @@ public class EthernetTracker { * NET_CAPABILITY_NOT_RESTRICTED) capability. Otherwise, returns false. */ boolean isRestrictedInterface(String iface) { - final NetworkCapabilities nc = getNetworkCapabilities(iface); - return !nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED); + final NetworkCapabilities nc = mNetworkCapabilities.get(iface); + return nc != null && !nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED); } void addListener(IEthernetServiceListener listener, boolean canUseRestrictedNetworks) { @@ -697,9 +623,17 @@ public class EthernetTracker { return; } - final NetworkCapabilities nc = getNetworkCapabilities(iface, hwAddress); - final IpConfiguration ipConfiguration = getIpConfiguration(iface, hwAddress); + NetworkCapabilities nc = mNetworkCapabilities.get(iface); + if (nc == null) { + // Try to resolve using mac address + nc = mNetworkCapabilities.get(hwAddress); + if (nc == null) { + final boolean isTestIface = iface.matches(TEST_IFACE_REGEXP); + nc = createDefaultNetworkCapabilities(isTestIface); + } + } + IpConfiguration ipConfiguration = getOrCreateIpConfiguration(iface); Log.d(TAG, "Tracking interface in client mode: " + iface); mFactory.addInterface(iface, hwAddress, ipConfiguration, nc); @@ -839,6 +773,25 @@ public class EthernetTracker { return new EthernetTrackerConfig(configString.split(";", /* limit of tokens */ 4)); } + private static NetworkCapabilities createDefaultNetworkCapabilities(boolean isTestIface) { + NetworkCapabilities.Builder builder = createNetworkCapabilities( + false /* clear default capabilities */, null, null) + .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) + .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED) + .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING) + .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED) + .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED) + .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED); + + if (isTestIface) { + builder.addTransportType(NetworkCapabilities.TRANSPORT_TEST); + } else { + builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); + } + + return builder.build(); + } + /** * Parses a static list of network capabilities * @@ -973,6 +926,15 @@ public class EthernetTracker { return new IpConfiguration.Builder().setStaticIpConfiguration(staticIpConfig).build(); } + private IpConfiguration getOrCreateIpConfiguration(String iface) { + IpConfiguration ret = mIpConfigurations.get(iface); + if (ret != null) return ret; + ret = new IpConfiguration(); + ret.setIpAssignment(IpAssignment.DHCP); + ret.setProxySettings(ProxySettings.NONE); + return ret; + } + private boolean isValidEthernetInterface(String iface) { return iface.matches(mIfaceMatch) || isValidTestInterface(iface); } @@ -1059,7 +1021,7 @@ public class EthernetTracker { pw.println("IP Configurations:"); pw.increaseIndent(); for (String iface : mIpConfigurations.keySet()) { - pw.println(iface + ": " + getIpConfiguration(iface)); + pw.println(iface + ": " + mIpConfigurations.get(iface)); } pw.decreaseIndent(); pw.println(); @@ -1067,7 +1029,7 @@ public class EthernetTracker { pw.println("Network Capabilities:"); pw.increaseIndent(); for (String iface : mNetworkCapabilities.keySet()) { - pw.println(iface + ": " + getNetworkCapabilities(iface)); + pw.println(iface + ": " + mNetworkCapabilities.get(iface)); } pw.decreaseIndent(); pw.println();