Merge "Revert "Allow MAC addresses to configure IP configurations"" into main
This commit is contained in:
commit
b60b24fdc5
2 changed files with 48 additions and 90 deletions
|
|
@ -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));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Reference in a new issue