Merge "Revert "Allow MAC addresses to configure IP configurations"" into main

This commit is contained in:
Treehugger Robot 2024-05-14 16:36:05 +00:00 • committed by Gerrit Code Review
commit b60b24fdc5
2 changed files with 48 additions and 90 deletions

View file

@ -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));
}
/**

View file

@ -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<String, NetworkCapabilities> mNetworkCapabilities =
new ConcurrentHashMap<>();
/** Mapping between {iface name | mac address} -> {IpConfiguration} */
private final ConcurrentHashMap<String, IpConfiguration> 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();