NsdService should set the Inet6Address scope ids

Link local Inet6Address cannot be used without scope id being set
properly. NsdService should set the Inet6Address scopes everywhere
NsdServiceInfo.setHost or NsdServiceInfo.setHostAddresses is used.

Test: atest CtsNetTestCases:android.net.cts.NsdManagerTest
Bug: 273391977
Change-Id: I45da6aebeba4e2e398e0b58ce3b88470fb60863b
This commit is contained in:
Yuyang Huang
2023-03-17 12:43:09 +09:00
parent 26af1880cd
commit aa0e9602bb
2 changed files with 52 additions and 31 deletions

View File

@@ -72,6 +72,7 @@ import com.android.server.connectivity.mdns.MdnsSocketProvider;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
@@ -1155,22 +1156,7 @@ public class NsdService extends INsdManager.Stub {
Log.e(TAG, "Invalid attribute", e);
}
}
final List<InetAddress> addresses = new ArrayList<>();
for (String ipv4Address : serviceInfo.getIpv4Addresses()) {
try {
addresses.add(InetAddresses.parseNumericAddress(ipv4Address));
} catch (IllegalArgumentException e) {
Log.wtf(TAG, "Invalid ipv4 address", e);
}
}
for (String ipv6Address : serviceInfo.getIpv6Addresses()) {
try {
addresses.add(InetAddresses.parseNumericAddress(ipv6Address));
} catch (IllegalArgumentException e) {
Log.wtf(TAG, "Invalid ipv6 address", e);
}
}
final List<InetAddress> addresses = getInetAddresses(serviceInfo);
if (addresses.size() != 0) {
info.setHostAddresses(addresses);
clientInfo.onResolveServiceSucceeded(clientId, info);
@@ -1202,21 +1188,7 @@ public class NsdService extends INsdManager.Stub {
}
}
final List<InetAddress> addresses = new ArrayList<>();
for (String ipv4Address : serviceInfo.getIpv4Addresses()) {
try {
addresses.add(InetAddresses.parseNumericAddress(ipv4Address));
} catch (IllegalArgumentException e) {
Log.wtf(TAG, "Invalid ipv4 address", e);
}
}
for (String ipv6Address : serviceInfo.getIpv6Addresses()) {
try {
addresses.add(InetAddresses.parseNumericAddress(ipv6Address));
} catch (IllegalArgumentException e) {
Log.wtf(TAG, "Invalid ipv6 address", e);
}
}
final List<InetAddress> addresses = getInetAddresses(serviceInfo);
info.setHostAddresses(addresses);
clientInfo.onServiceUpdated(clientId, info);
break;
@@ -1232,6 +1204,36 @@ public class NsdService extends INsdManager.Stub {
}
}
@NonNull
private static List<InetAddress> getInetAddresses(@NonNull MdnsServiceInfo serviceInfo) {
final List<String> v4Addrs = serviceInfo.getIpv4Addresses();
final List<String> v6Addrs = serviceInfo.getIpv6Addresses();
final List<InetAddress> addresses = new ArrayList<>(v4Addrs.size() + v6Addrs.size());
for (String ipv4Address : v4Addrs) {
try {
addresses.add(InetAddresses.parseNumericAddress(ipv4Address));
} catch (IllegalArgumentException e) {
Log.wtf(TAG, "Invalid ipv4 address", e);
}
}
for (String ipv6Address : v6Addrs) {
try {
final InetAddress addr = InetAddresses.parseNumericAddress(ipv6Address);
if (addr.isLinkLocalAddress()) {
final Inet6Address v6Addr = Inet6Address.getByAddress(
null /* host */, addr.getAddress(),
serviceInfo.getInterfaceIndex());
addresses.add(v6Addr);
} else {
addresses.add(addr);
}
} catch (IllegalArgumentException | UnknownHostException e) {
Log.wtf(TAG, "Invalid ipv6 address", e);
}
}
return addresses;
}
private static void setServiceNetworkForCallback(NsdServiceInfo info, int netId, int ifaceIdx) {
switch (netId) {
case NETID_UNSET: