diff options
author | Treehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com> | 2024-04-17 00:56:53 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2024-04-17 00:56:53 +0000 |
commit | fd207b88e7c5e024056d8ecc9b13b792b2b8ea9f (patch) | |
tree | 1345e35fc10224aead91489156bbb9014c62149a | |
parent | f41e6019dd3d10d8296eb585fb623c3e32fd0b94 (diff) | |
parent | dbbada4d7bdc48f3c2ec9981b3716662a5a2d5f8 (diff) | |
download | Connectivity-fd207b88e7c5e024056d8ecc9b13b792b2b8ea9f.tar.gz |
Merge "Allow MAC addresses to configure IP configurations" into main
-rw-r--r-- | service-t/src/com/android/server/ethernet/EthernetServiceImpl.java | 6 | ||||
-rw-r--r-- | service-t/src/com/android/server/ethernet/EthernetTracker.java | 132 |
2 files changed, 90 insertions, 48 deletions
diff --git a/service-t/src/com/android/server/ethernet/EthernetServiceImpl.java b/service-t/src/com/android/server/ethernet/EthernetServiceImpl.java index b8689d6f17..92f19531fb 100644 --- a/service-t/src/com/android/server/ethernet/EthernetServiceImpl.java +++ b/service-t/src/com/android/server/ethernet/EthernetServiceImpl.java @@ -108,7 +108,11 @@ public class EthernetServiceImpl extends IEthernetManager.Stub { PermissionUtils.enforceRestrictedNetworkPermission(mContext, TAG); } - return new IpConfiguration(mTracker.getIpConfiguration(iface)); + // 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); } /** diff --git a/service-t/src/com/android/server/ethernet/EthernetTracker.java b/service-t/src/com/android/server/ethernet/EthernetTracker.java index 71f289e5c2..a60592fac2 100644 --- a/service-t/src/com/android/server/ethernet/EthernetTracker.java +++ b/service-t/src/com/android/server/ethernet/EthernetTracker.java @@ -31,8 +31,6 @@ 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; @@ -111,6 +109,7 @@ public class EthernetTracker { /** Mapping between {iface name | mac address} -> {NetworkCapabilities} */ private final ConcurrentHashMap<String, NetworkCapabilities> mNetworkCapabilities = new ConcurrentHashMap<>(); + /** Mapping between {iface name | mac address} -> {IpConfiguration} */ private final ConcurrentHashMap<String, IpConfiguration> mIpConfigurations = new ConcurrentHashMap<>(); @@ -298,7 +297,7 @@ public class EthernetTracker { } private IpConfiguration getIpConfigurationForCallback(String iface, int state) { - return (state == EthernetManager.STATE_ABSENT) ? null : getOrCreateIpConfiguration(iface); + return (state == EthernetManager.STATE_ABSENT) ? null : getIpConfiguration(iface); } private void ensureRunningOnEthernetServiceThread() { @@ -391,8 +390,83 @@ public class EthernetTracker { mHandler.post(() -> setInterfaceAdministrativeState(iface, enabled, cb)); } - IpConfiguration getIpConfiguration(String iface) { - return mIpConfigurations.get(iface); + 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(); } @VisibleForTesting(visibility = PACKAGE) @@ -433,8 +507,8 @@ public class EthernetTracker { * NET_CAPABILITY_NOT_RESTRICTED) capability. Otherwise, returns false. */ boolean isRestrictedInterface(String iface) { - final NetworkCapabilities nc = mNetworkCapabilities.get(iface); - return nc != null && !nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED); + final NetworkCapabilities nc = getNetworkCapabilities(iface); + return !nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED); } void addListener(IEthernetServiceListener listener, boolean canUseRestrictedNetworks) { @@ -623,17 +697,9 @@ public class EthernetTracker { return; } - 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); - } - } + final NetworkCapabilities nc = getNetworkCapabilities(iface, hwAddress); + final IpConfiguration ipConfiguration = getIpConfiguration(iface, hwAddress); - IpConfiguration ipConfiguration = getOrCreateIpConfiguration(iface); Log.d(TAG, "Tracking interface in client mode: " + iface); mFactory.addInterface(iface, hwAddress, ipConfiguration, nc); @@ -773,25 +839,6 @@ 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 * @@ -926,15 +973,6 @@ 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); } @@ -1021,7 +1059,7 @@ public class EthernetTracker { pw.println("IP Configurations:"); pw.increaseIndent(); for (String iface : mIpConfigurations.keySet()) { - pw.println(iface + ": " + mIpConfigurations.get(iface)); + pw.println(iface + ": " + getIpConfiguration(iface)); } pw.decreaseIndent(); pw.println(); @@ -1029,7 +1067,7 @@ public class EthernetTracker { pw.println("Network Capabilities:"); pw.increaseIndent(); for (String iface : mNetworkCapabilities.keySet()) { - pw.println(iface + ": " + mNetworkCapabilities.get(iface)); + pw.println(iface + ": " + getNetworkCapabilities(iface)); } pw.decreaseIndent(); pw.println(); |