Add the list of private DNS addresses to LinkProperties

Test: atest android.net.LinkPropertiesTest, also new tests pass
Bug: 73641539
Change-Id: If33a35b1354a67db09411ff098f20064797296ad
This commit is contained in:
Chalard Jean
2018-04-11 16:36:41 +09:00
parent 687ddf6928
commit 3e0a46a439
2 changed files with 171 additions and 24 deletions

View File

@@ -50,6 +50,7 @@ public final class LinkProperties implements Parcelable {
private String mIfaceName; private String mIfaceName;
private ArrayList<LinkAddress> mLinkAddresses = new ArrayList<LinkAddress>(); private ArrayList<LinkAddress> mLinkAddresses = new ArrayList<LinkAddress>();
private ArrayList<InetAddress> mDnses = new ArrayList<InetAddress>(); private ArrayList<InetAddress> mDnses = new ArrayList<InetAddress>();
private ArrayList<InetAddress> mValidatedPrivateDnses = new ArrayList<InetAddress>();
private boolean mUsePrivateDns; private boolean mUsePrivateDns;
private String mPrivateDnsServerName; private String mPrivateDnsServerName;
private String mDomains; private String mDomains;
@@ -167,6 +168,9 @@ public final class LinkProperties implements Parcelable {
mIfaceName = source.getInterfaceName(); mIfaceName = source.getInterfaceName();
for (LinkAddress l : source.getLinkAddresses()) mLinkAddresses.add(l); for (LinkAddress l : source.getLinkAddresses()) mLinkAddresses.add(l);
for (InetAddress i : source.getDnsServers()) mDnses.add(i); for (InetAddress i : source.getDnsServers()) mDnses.add(i);
for (InetAddress i : source.getValidatedPrivateDnsServers()) {
mValidatedPrivateDnses.add(i);
}
mUsePrivateDns = source.mUsePrivateDns; mUsePrivateDns = source.mUsePrivateDns;
mPrivateDnsServerName = source.mPrivateDnsServerName; mPrivateDnsServerName = source.mPrivateDnsServerName;
mDomains = source.getDomains(); mDomains = source.getDomains();
@@ -374,7 +378,7 @@ public final class LinkProperties implements Parcelable {
* Replaces the DNS servers in this {@code LinkProperties} with * Replaces the DNS servers in this {@code LinkProperties} with
* the given {@link Collection} of {@link InetAddress} objects. * the given {@link Collection} of {@link InetAddress} objects.
* *
* @param addresses The {@link Collection} of DNS servers to set in this object. * @param dnsServers The {@link Collection} of DNS servers to set in this object.
* @hide * @hide
*/ */
public void setDnsServers(Collection<InetAddress> dnsServers) { public void setDnsServers(Collection<InetAddress> dnsServers) {
@@ -447,6 +451,65 @@ public final class LinkProperties implements Parcelable {
return mPrivateDnsServerName; return mPrivateDnsServerName;
} }
/**
* Adds the given {@link InetAddress} to the list of validated private DNS servers,
* if not present. This is distinct from the server name in that these are actually
* resolved addresses.
*
* @param dnsServer The {@link InetAddress} to add to the list of validated private DNS servers.
* @return true if the DNS server was added, false if it was already present.
* @hide
*/
public boolean addValidatedPrivateDnsServer(InetAddress dnsServer) {
if (dnsServer != null && !mValidatedPrivateDnses.contains(dnsServer)) {
mValidatedPrivateDnses.add(dnsServer);
return true;
}
return false;
}
/**
* Removes the given {@link InetAddress} from the list of validated private DNS servers.
*
* @param dnsServer The {@link InetAddress} to remove from the list of validated private DNS
* servers.
* @return true if the DNS server was removed, false if it did not exist.
* @hide
*/
public boolean removeValidatedPrivateDnsServer(InetAddress dnsServer) {
if (dnsServer != null) {
return mValidatedPrivateDnses.remove(dnsServer);
}
return false;
}
/**
* Replaces the validated private DNS servers in this {@code LinkProperties} with
* the given {@link Collection} of {@link InetAddress} objects.
*
* @param dnsServers The {@link Collection} of validated private DNS servers to set in this
* object.
* @hide
*/
public void setValidatedPrivateDnsServers(Collection<InetAddress> dnsServers) {
mValidatedPrivateDnses.clear();
for (InetAddress dnsServer: dnsServers) {
addValidatedPrivateDnsServer(dnsServer);
}
}
/**
* Returns all the {@link InetAddress} for validated private DNS servers on this link.
* These are resolved from the private DNS server name.
*
* @return An umodifiable {@link List} of {@link InetAddress} for validated private
* DNS servers on this link.
* @hide
*/
public List<InetAddress> getValidatedPrivateDnsServers() {
return Collections.unmodifiableList(mValidatedPrivateDnses);
}
/** /**
* Sets the DNS domain search path used on this link. * Sets the DNS domain search path used on this link.
* *
@@ -715,6 +778,15 @@ public final class LinkProperties implements Parcelable {
privateDnsServerName = "PrivateDnsServerName: " + mPrivateDnsServerName + " "; privateDnsServerName = "PrivateDnsServerName: " + mPrivateDnsServerName + " ";
} }
String validatedPrivateDns = "";
if (!mValidatedPrivateDnses.isEmpty()) {
validatedPrivateDns = "ValidatedPrivateDnsAddresses: [";
for (InetAddress addr : mValidatedPrivateDnses) {
validatedPrivateDns += addr.getHostAddress() + ",";
}
validatedPrivateDns += "] ";
}
String domainName = "Domains: " + mDomains; String domainName = "Domains: " + mDomains;
String mtu = " MTU: " + mMtu; String mtu = " MTU: " + mMtu;
@@ -959,7 +1031,7 @@ public final class LinkProperties implements Parcelable {
if (mDomains.equals(targetDomains) == false) return false; if (mDomains.equals(targetDomains) == false) return false;
} }
return (mDnses.size() == targetDnses.size()) ? return (mDnses.size() == targetDnses.size()) ?
mDnses.containsAll(targetDnses) : false; mDnses.containsAll(targetDnses) : false;
} }
/** /**
@@ -976,6 +1048,20 @@ public final class LinkProperties implements Parcelable {
target.getPrivateDnsServerName())); target.getPrivateDnsServerName()));
} }
/**
* Compares this {@code LinkProperties} validated private DNS addresses against
* the target
*
* @param target LinkProperties to compare.
* @return {@code true} if both are identical, {@code false} otherwise.
* @hide
*/
public boolean isIdenticalValidatedPrivateDnses(LinkProperties target) {
Collection<InetAddress> targetDnses = target.getValidatedPrivateDnsServers();
return (mValidatedPrivateDnses.size() == targetDnses.size())
? mValidatedPrivateDnses.containsAll(targetDnses) : false;
}
/** /**
* Compares this {@code LinkProperties} Routes against the target * Compares this {@code LinkProperties} Routes against the target
* *
@@ -986,7 +1072,7 @@ public final class LinkProperties implements Parcelable {
public boolean isIdenticalRoutes(LinkProperties target) { public boolean isIdenticalRoutes(LinkProperties target) {
Collection<RouteInfo> targetRoutes = target.getRoutes(); Collection<RouteInfo> targetRoutes = target.getRoutes();
return (mRoutes.size() == targetRoutes.size()) ? return (mRoutes.size() == targetRoutes.size()) ?
mRoutes.containsAll(targetRoutes) : false; mRoutes.containsAll(targetRoutes) : false;
} }
/** /**
@@ -998,7 +1084,7 @@ public final class LinkProperties implements Parcelable {
*/ */
public boolean isIdenticalHttpProxy(LinkProperties target) { public boolean isIdenticalHttpProxy(LinkProperties target) {
return getHttpProxy() == null ? target.getHttpProxy() == null : return getHttpProxy() == null ? target.getHttpProxy() == null :
getHttpProxy().equals(target.getHttpProxy()); getHttpProxy().equals(target.getHttpProxy());
} }
/** /**
@@ -1074,6 +1160,7 @@ public final class LinkProperties implements Parcelable {
&& isIdenticalAddresses(target) && isIdenticalAddresses(target)
&& isIdenticalDnses(target) && isIdenticalDnses(target)
&& isIdenticalPrivateDns(target) && isIdenticalPrivateDns(target)
&& isIdenticalValidatedPrivateDnses(target)
&& isIdenticalRoutes(target) && isIdenticalRoutes(target)
&& isIdenticalHttpProxy(target) && isIdenticalHttpProxy(target)
&& isIdenticalStackedLinks(target) && isIdenticalStackedLinks(target)
@@ -1120,6 +1207,19 @@ public final class LinkProperties implements Parcelable {
return new CompareResult<>(mDnses, target != null ? target.getDnsServers() : null); return new CompareResult<>(mDnses, target != null ? target.getDnsServers() : null);
} }
/**
* Compares the validated private DNS addresses in this LinkProperties with another
* LinkProperties.
*
* @param target a LinkProperties with the new list of validated private dns addresses
* @return the differences between the DNS addresses.
* @hide
*/
public CompareResult<InetAddress> compareValidatedPrivateDnses(LinkProperties target) {
return new CompareResult<>(mValidatedPrivateDnses,
target != null ? target.getValidatedPrivateDnsServers() : null);
}
/** /**
* Compares all routes in this LinkProperties with another LinkProperties, * Compares all routes in this LinkProperties with another LinkProperties,
* examining both the the base link and all stacked links. * examining both the the base link and all stacked links.
@@ -1168,6 +1268,7 @@ public final class LinkProperties implements Parcelable {
return ((null == mIfaceName) ? 0 : mIfaceName.hashCode() return ((null == mIfaceName) ? 0 : mIfaceName.hashCode()
+ mLinkAddresses.size() * 31 + mLinkAddresses.size() * 31
+ mDnses.size() * 37 + mDnses.size() * 37
+ mValidatedPrivateDnses.size() * 61
+ ((null == mDomains) ? 0 : mDomains.hashCode()) + ((null == mDomains) ? 0 : mDomains.hashCode())
+ mRoutes.size() * 41 + mRoutes.size() * 41
+ ((null == mHttpProxy) ? 0 : mHttpProxy.hashCode()) + ((null == mHttpProxy) ? 0 : mHttpProxy.hashCode())
@@ -1184,12 +1285,16 @@ public final class LinkProperties implements Parcelable {
public void writeToParcel(Parcel dest, int flags) { public void writeToParcel(Parcel dest, int flags) {
dest.writeString(getInterfaceName()); dest.writeString(getInterfaceName());
dest.writeInt(mLinkAddresses.size()); dest.writeInt(mLinkAddresses.size());
for(LinkAddress linkAddress : mLinkAddresses) { for (LinkAddress linkAddress : mLinkAddresses) {
dest.writeParcelable(linkAddress, flags); dest.writeParcelable(linkAddress, flags);
} }
dest.writeInt(mDnses.size()); dest.writeInt(mDnses.size());
for(InetAddress d : mDnses) { for (InetAddress d : mDnses) {
dest.writeByteArray(d.getAddress());
}
dest.writeInt(mValidatedPrivateDnses.size());
for (InetAddress d : mValidatedPrivateDnses) {
dest.writeByteArray(d.getAddress()); dest.writeByteArray(d.getAddress());
} }
dest.writeBoolean(mUsePrivateDns); dest.writeBoolean(mUsePrivateDns);
@@ -1198,7 +1303,7 @@ public final class LinkProperties implements Parcelable {
dest.writeInt(mMtu); dest.writeInt(mMtu);
dest.writeString(mTcpBufferSizes); dest.writeString(mTcpBufferSizes);
dest.writeInt(mRoutes.size()); dest.writeInt(mRoutes.size());
for(RouteInfo route : mRoutes) { for (RouteInfo route : mRoutes) {
dest.writeParcelable(route, flags); dest.writeParcelable(route, flags);
} }
@@ -1225,26 +1330,33 @@ public final class LinkProperties implements Parcelable {
netProp.setInterfaceName(iface); netProp.setInterfaceName(iface);
} }
int addressCount = in.readInt(); int addressCount = in.readInt();
for (int i=0; i<addressCount; i++) { for (int i = 0; i < addressCount; i++) {
netProp.addLinkAddress((LinkAddress)in.readParcelable(null)); netProp.addLinkAddress((LinkAddress) in.readParcelable(null));
} }
addressCount = in.readInt(); addressCount = in.readInt();
for (int i=0; i<addressCount; i++) { for (int i = 0; i < addressCount; i++) {
try { try {
netProp.addDnsServer(InetAddress.getByAddress(in.createByteArray())); netProp.addDnsServer(InetAddress.getByAddress(in.createByteArray()));
} catch (UnknownHostException e) { } } catch (UnknownHostException e) { }
} }
addressCount = in.readInt();
for (int i = 0; i < addressCount; i++) {
try {
netProp.addValidatedPrivateDnsServer(
InetAddress.getByAddress(in.createByteArray()));
} catch (UnknownHostException e) { }
}
netProp.setUsePrivateDns(in.readBoolean()); netProp.setUsePrivateDns(in.readBoolean());
netProp.setPrivateDnsServerName(in.readString()); netProp.setPrivateDnsServerName(in.readString());
netProp.setDomains(in.readString()); netProp.setDomains(in.readString());
netProp.setMtu(in.readInt()); netProp.setMtu(in.readInt());
netProp.setTcpBufferSizes(in.readString()); netProp.setTcpBufferSizes(in.readString());
addressCount = in.readInt(); addressCount = in.readInt();
for (int i=0; i<addressCount; i++) { for (int i = 0; i < addressCount; i++) {
netProp.addRoute((RouteInfo)in.readParcelable(null)); netProp.addRoute((RouteInfo) in.readParcelable(null));
} }
if (in.readByte() == 1) { if (in.readByte() == 1) {
netProp.setHttpProxy((ProxyInfo)in.readParcelable(null)); netProp.setHttpProxy((ProxyInfo) in.readParcelable(null));
} }
ArrayList<LinkProperties> stackedLinks = new ArrayList<LinkProperties>(); ArrayList<LinkProperties> stackedLinks = new ArrayList<LinkProperties>();
in.readList(stackedLinks, LinkProperties.class.getClassLoader()); in.readList(stackedLinks, LinkProperties.class.getClassLoader());
@@ -1259,16 +1371,16 @@ public final class LinkProperties implements Parcelable {
} }
}; };
/** /**
* Check the valid MTU range based on IPv4 or IPv6. * Check the valid MTU range based on IPv4 or IPv6.
* @hide * @hide
*/ */
public static boolean isValidMtu(int mtu, boolean ipv6) { public static boolean isValidMtu(int mtu, boolean ipv6) {
if (ipv6) { if (ipv6) {
if ((mtu >= MIN_MTU_V6 && mtu <= MAX_MTU)) return true; if (mtu >= MIN_MTU_V6 && mtu <= MAX_MTU) return true;
} else { } else {
if ((mtu >= MIN_MTU && mtu <= MAX_MTU)) return true; if (mtu >= MIN_MTU && mtu <= MAX_MTU) return true;
}
return false;
} }
return false;
}
} }

View File

@@ -27,6 +27,7 @@ import android.net.LinkProperties;
import android.net.LinkProperties.CompareResult; import android.net.LinkProperties.CompareResult;
import android.net.LinkProperties.ProvisioningChange; import android.net.LinkProperties.ProvisioningChange;
import android.net.RouteInfo; import android.net.RouteInfo;
import android.os.Parcel;
import android.support.test.filters.SmallTest; import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4; import android.support.test.runner.AndroidJUnit4;
import android.system.OsConstants; import android.system.OsConstants;
@@ -82,6 +83,9 @@ public class LinkPropertiesTest {
assertTrue(source.isIdenticalPrivateDns(target)); assertTrue(source.isIdenticalPrivateDns(target));
assertTrue(target.isIdenticalPrivateDns(source)); assertTrue(target.isIdenticalPrivateDns(source));
assertTrue(source.isIdenticalValidatedPrivateDnses(target));
assertTrue(target.isIdenticalValidatedPrivateDnses(source));
assertTrue(source.isIdenticalRoutes(target)); assertTrue(source.isIdenticalRoutes(target));
assertTrue(target.isIdenticalRoutes(source)); assertTrue(target.isIdenticalRoutes(source));
@@ -784,4 +788,35 @@ public class LinkPropertiesTest {
assertEquals(new ArraySet<>(expectAdded), new ArraySet<>(result.added)); assertEquals(new ArraySet<>(expectAdded), new ArraySet<>(result.added));
assertEquals(new ArraySet<>(expectRemoved), (new ArraySet<>(result.removed))); assertEquals(new ArraySet<>(expectRemoved), (new ArraySet<>(result.removed)));
} }
@Test
public void testLinkPropertiesParcelable() {
LinkProperties source = new LinkProperties();
source.setInterfaceName(NAME);
// set 2 link addresses
source.addLinkAddress(LINKADDRV4);
source.addLinkAddress(LINKADDRV6);
// set 2 dnses
source.addDnsServer(DNS1);
source.addDnsServer(DNS2);
// set 2 gateways
source.addRoute(new RouteInfo(GATEWAY1));
source.addRoute(new RouteInfo(GATEWAY2));
// set 2 validated private dnses
source.addValidatedPrivateDnsServer(DNS6);
source.addValidatedPrivateDnsServer(GATEWAY61);
source.setMtu(MTU);
Parcel p = Parcel.obtain();
source.writeToParcel(p, /* flags */ 0);
p.setDataPosition(0);
final byte[] marshalled = p.marshall();
p = Parcel.obtain();
p.unmarshall(marshalled, 0, marshalled.length);
p.setDataPosition(0);
LinkProperties dest = LinkProperties.CREATOR.createFromParcel(p);
assertEquals(source, dest);
}
} }