Merge "Add newApi linter check for mDNS library" into main
This commit is contained in:
@@ -19,7 +19,9 @@ package android.net.nsd;
|
|||||||
import android.annotation.IntRange;
|
import android.annotation.IntRange;
|
||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
|
import android.annotation.RequiresApi;
|
||||||
import android.annotation.SystemApi;
|
import android.annotation.SystemApi;
|
||||||
|
import android.os.Build;
|
||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
|
|
||||||
@@ -38,6 +40,7 @@ import java.util.Objects;
|
|||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
@SystemApi
|
@SystemApi
|
||||||
|
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
|
||||||
public final class OffloadServiceInfo implements Parcelable {
|
public final class OffloadServiceInfo implements Parcelable {
|
||||||
@NonNull
|
@NonNull
|
||||||
private final Key mKey;
|
private final Key mKey;
|
||||||
|
|||||||
@@ -91,6 +91,10 @@ java_library {
|
|||||||
java_library {
|
java_library {
|
||||||
name: "service-connectivity-mdns-standalone-build-test",
|
name: "service-connectivity-mdns-standalone-build-test",
|
||||||
sdk_version: "core_platform",
|
sdk_version: "core_platform",
|
||||||
|
min_sdk_version: "21",
|
||||||
|
lint: {
|
||||||
|
error_checks: ["NewApi"],
|
||||||
|
},
|
||||||
srcs: [
|
srcs: [
|
||||||
"src/com/android/server/connectivity/mdns/**/*.java",
|
"src/com/android/server/connectivity/mdns/**/*.java",
|
||||||
":framework-connectivity-t-mdns-standalone-build-sources",
|
":framework-connectivity-t-mdns-standalone-build-sources",
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ import static com.android.server.connectivity.mdns.util.MdnsUtils.Clock;
|
|||||||
|
|
||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
|
import android.annotation.RequiresApi;
|
||||||
import android.app.ActivityManager;
|
import android.app.ActivityManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
@@ -59,6 +60,7 @@ import android.net.nsd.OffloadEngine;
|
|||||||
import android.net.nsd.OffloadServiceInfo;
|
import android.net.nsd.OffloadServiceInfo;
|
||||||
import android.net.wifi.WifiManager;
|
import android.net.wifi.WifiManager;
|
||||||
import android.os.Binder;
|
import android.os.Binder;
|
||||||
|
import android.os.Build;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.HandlerThread;
|
import android.os.HandlerThread;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
@@ -120,6 +122,7 @@ import java.util.regex.Pattern;
|
|||||||
*
|
*
|
||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
|
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
|
||||||
public class NsdService extends INsdManager.Stub {
|
public class NsdService extends INsdManager.Stub {
|
||||||
private static final String TAG = "NsdService";
|
private static final String TAG = "NsdService";
|
||||||
private static final String MDNS_TAG = "mDnsConnector";
|
private static final String MDNS_TAG = "mDnsConnector";
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package com.android.server.connectivity.mdns;
|
|||||||
import static com.android.server.connectivity.mdns.MdnsServiceTypeClient.INVALID_TRANSACTION_ID;
|
import static com.android.server.connectivity.mdns.MdnsServiceTypeClient.INVALID_TRANSACTION_ID;
|
||||||
|
|
||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
|
import android.os.Build;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
|
|
||||||
@@ -220,7 +221,9 @@ public class EnqueueMdnsQueryCallable implements Callable<Pair<Integer, List<Str
|
|||||||
throws IOException {
|
throws IOException {
|
||||||
DatagramPacket packet = packetWriter.getPacket(address);
|
DatagramPacket packet = packetWriter.getPacket(address);
|
||||||
if (expectUnicastResponse) {
|
if (expectUnicastResponse) {
|
||||||
if (requestSender instanceof MdnsMultinetworkSocketClient) {
|
// MdnsMultinetworkSocketClient is only available on T+
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU
|
||||||
|
&& requestSender instanceof MdnsMultinetworkSocketClient) {
|
||||||
((MdnsMultinetworkSocketClient) requestSender).sendPacketRequestingUnicastResponse(
|
((MdnsMultinetworkSocketClient) requestSender).sendPacketRequestingUnicastResponse(
|
||||||
packet, socketKey, onlyUseIpv6OnIpv6OnlyNetworks);
|
packet, socketKey, onlyUseIpv6OnIpv6OnlyNetworks);
|
||||||
} else {
|
} else {
|
||||||
@@ -228,7 +231,8 @@ public class EnqueueMdnsQueryCallable implements Callable<Pair<Integer, List<Str
|
|||||||
packet, onlyUseIpv6OnIpv6OnlyNetworks);
|
packet, onlyUseIpv6OnIpv6OnlyNetworks);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (requestSender instanceof MdnsMultinetworkSocketClient) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU
|
||||||
|
&& requestSender instanceof MdnsMultinetworkSocketClient) {
|
||||||
((MdnsMultinetworkSocketClient) requestSender)
|
((MdnsMultinetworkSocketClient) requestSender)
|
||||||
.sendPacketRequestingMulticastResponse(
|
.sendPacketRequestingMulticastResponse(
|
||||||
packet, socketKey, onlyUseIpv6OnIpv6OnlyNetworks);
|
packet, socketKey, onlyUseIpv6OnIpv6OnlyNetworks);
|
||||||
|
|||||||
@@ -17,7 +17,8 @@
|
|||||||
package com.android.server.connectivity.mdns;
|
package com.android.server.connectivity.mdns;
|
||||||
|
|
||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
import android.util.ArraySet;
|
|
||||||
|
import com.android.server.connectivity.mdns.util.MdnsUtils;
|
||||||
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.ScheduledExecutorService;
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
@@ -30,7 +31,7 @@ import java.util.concurrent.ScheduledThreadPoolExecutor;
|
|||||||
public class ExecutorProvider {
|
public class ExecutorProvider {
|
||||||
|
|
||||||
private final Set<ScheduledExecutorService> serviceTypeClientSchedulerExecutors =
|
private final Set<ScheduledExecutorService> serviceTypeClientSchedulerExecutors =
|
||||||
new ArraySet<>();
|
MdnsUtils.newSet();
|
||||||
|
|
||||||
/** Returns a new {@link ScheduledExecutorService} instance. */
|
/** Returns a new {@link ScheduledExecutorService} instance. */
|
||||||
public ScheduledExecutorService newServiceTypeClientSchedulerExecutor() {
|
public ScheduledExecutorService newServiceTypeClientSchedulerExecutor() {
|
||||||
|
|||||||
@@ -21,12 +21,14 @@ import static com.android.server.connectivity.mdns.MdnsRecord.MAX_LABEL_LENGTH;
|
|||||||
|
|
||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
|
import android.annotation.RequiresApi;
|
||||||
import android.net.LinkAddress;
|
import android.net.LinkAddress;
|
||||||
import android.net.Network;
|
import android.net.Network;
|
||||||
import android.net.nsd.NsdManager;
|
import android.net.nsd.NsdManager;
|
||||||
import android.net.nsd.NsdServiceInfo;
|
import android.net.nsd.NsdServiceInfo;
|
||||||
import android.net.nsd.OffloadEngine;
|
import android.net.nsd.OffloadEngine;
|
||||||
import android.net.nsd.OffloadServiceInfo;
|
import android.net.nsd.OffloadServiceInfo;
|
||||||
|
import android.os.Build;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.util.ArrayMap;
|
import android.util.ArrayMap;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
@@ -50,6 +52,7 @@ import java.util.function.Consumer;
|
|||||||
*
|
*
|
||||||
* All methods except the constructor must be called on the looper thread.
|
* All methods except the constructor must be called on the looper thread.
|
||||||
*/
|
*/
|
||||||
|
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
|
||||||
public class MdnsAdvertiser {
|
public class MdnsAdvertiser {
|
||||||
private static final String TAG = MdnsAdvertiser.class.getSimpleName();
|
private static final String TAG = MdnsAdvertiser.class.getSimpleName();
|
||||||
static final boolean DBG = Log.isLoggable(TAG, Log.DEBUG);
|
static final boolean DBG = Log.isLoggable(TAG, Log.DEBUG);
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ package com.android.server.connectivity.mdns;
|
|||||||
|
|
||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
|
import android.annotation.RequiresApi;
|
||||||
|
import android.os.Build;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
|
|
||||||
import com.android.internal.annotations.VisibleForTesting;
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
@@ -31,6 +33,7 @@ import java.util.List;
|
|||||||
*
|
*
|
||||||
* This allows maintaining other hosts' caches up-to-date. See RFC6762 8.3.
|
* This allows maintaining other hosts' caches up-to-date. See RFC6762 8.3.
|
||||||
*/
|
*/
|
||||||
|
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
|
||||||
public class MdnsAnnouncer extends MdnsPacketRepeater<MdnsAnnouncer.BaseAnnouncementInfo> {
|
public class MdnsAnnouncer extends MdnsPacketRepeater<MdnsAnnouncer.BaseAnnouncementInfo> {
|
||||||
private static final long ANNOUNCEMENT_INITIAL_DELAY_MS = 1000L;
|
private static final long ANNOUNCEMENT_INITIAL_DELAY_MS = 1000L;
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ import com.android.server.connectivity.mdns.util.MdnsUtils;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class keeps tracking the set of registered {@link MdnsServiceBrowserListener} instances, and
|
* This class keeps tracking the set of registered {@link MdnsServiceBrowserListener} instances, and
|
||||||
@@ -102,8 +103,12 @@ public class MdnsDiscoveryManager implements MdnsSocketClientBase.Callback {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void remove(@NonNull MdnsServiceTypeClient client) {
|
public void remove(@NonNull MdnsServiceTypeClient client) {
|
||||||
final int index = clients.indexOfValue(client);
|
for (int i = 0; i < clients.size(); ++i) {
|
||||||
clients.removeAt(index);
|
if (Objects.equals(client, clients.valueAt(i))) {
|
||||||
|
clients.removeAt(i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isEmpty() {
|
public boolean isEmpty() {
|
||||||
|
|||||||
@@ -20,8 +20,10 @@ import static com.android.server.connectivity.mdns.MdnsConstants.NO_PACKET;
|
|||||||
|
|
||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
|
import android.annotation.RequiresApi;
|
||||||
import android.net.LinkAddress;
|
import android.net.LinkAddress;
|
||||||
import android.net.nsd.NsdServiceInfo;
|
import android.net.nsd.NsdServiceInfo;
|
||||||
|
import android.os.Build;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
|
|
||||||
@@ -39,6 +41,7 @@ import java.util.List;
|
|||||||
/**
|
/**
|
||||||
* A class that handles advertising services on a {@link MdnsInterfaceSocket} tied to an interface.
|
* A class that handles advertising services on a {@link MdnsInterfaceSocket} tied to an interface.
|
||||||
*/
|
*/
|
||||||
|
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
|
||||||
public class MdnsInterfaceAdvertiser implements MulticastPacketReader.PacketHandler {
|
public class MdnsInterfaceAdvertiser implements MulticastPacketReader.PacketHandler {
|
||||||
private static final boolean DBG = MdnsAdvertiser.DBG;
|
private static final boolean DBG = MdnsAdvertiser.DBG;
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
|
|||||||
@@ -20,8 +20,10 @@ import static com.android.server.connectivity.mdns.MdnsSocket.MULTICAST_IPV4_ADD
|
|||||||
import static com.android.server.connectivity.mdns.MdnsSocket.MULTICAST_IPV6_ADDRESS;
|
import static com.android.server.connectivity.mdns.MdnsSocket.MULTICAST_IPV6_ADDRESS;
|
||||||
|
|
||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
|
import android.annotation.RequiresApi;
|
||||||
import android.net.LinkAddress;
|
import android.net.LinkAddress;
|
||||||
import android.net.util.SocketUtils;
|
import android.net.util.SocketUtils;
|
||||||
|
import android.os.Build;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.os.ParcelFileDescriptor;
|
import android.os.ParcelFileDescriptor;
|
||||||
@@ -49,6 +51,7 @@ import java.util.List;
|
|||||||
* @see MulticastSocket for javadoc of each public method.
|
* @see MulticastSocket for javadoc of each public method.
|
||||||
* @see MulticastSocket for javadoc of each public method.
|
* @see MulticastSocket for javadoc of each public method.
|
||||||
*/
|
*/
|
||||||
|
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
|
||||||
public class MdnsInterfaceSocket {
|
public class MdnsInterfaceSocket {
|
||||||
private static final String TAG = MdnsInterfaceSocket.class.getSimpleName();
|
private static final String TAG = MdnsInterfaceSocket.class.getSimpleName();
|
||||||
@NonNull private final MulticastSocket mMulticastSocket;
|
@NonNull private final MulticastSocket mMulticastSocket;
|
||||||
|
|||||||
@@ -20,8 +20,10 @@ import static com.android.server.connectivity.mdns.util.MdnsUtils.ensureRunningO
|
|||||||
|
|
||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
|
import android.annotation.RequiresApi;
|
||||||
import android.net.LinkAddress;
|
import android.net.LinkAddress;
|
||||||
import android.net.Network;
|
import android.net.Network;
|
||||||
|
import android.os.Build;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.util.ArrayMap;
|
import android.util.ArrayMap;
|
||||||
@@ -40,6 +42,7 @@ import java.util.List;
|
|||||||
*
|
*
|
||||||
* * <p>This class is not thread safe.
|
* * <p>This class is not thread safe.
|
||||||
*/
|
*/
|
||||||
|
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
|
||||||
public class MdnsMultinetworkSocketClient implements MdnsSocketClientBase {
|
public class MdnsMultinetworkSocketClient implements MdnsSocketClientBase {
|
||||||
private static final String TAG = MdnsMultinetworkSocketClient.class.getSimpleName();
|
private static final String TAG = MdnsMultinetworkSocketClient.class.getSimpleName();
|
||||||
private static final boolean DBG = MdnsDiscoveryManager.DBG;
|
private static final boolean DBG = MdnsDiscoveryManager.DBG;
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ package com.android.server.connectivity.mdns;
|
|||||||
|
|
||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
import java.io.EOFException;
|
import java.io.EOFException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -206,9 +205,6 @@ public class MdnsPacket {
|
|||||||
|
|
||||||
default: {
|
default: {
|
||||||
try {
|
try {
|
||||||
if (MdnsAdvertiser.DBG) {
|
|
||||||
Log.i(TAG, "Skipping parsing of record of unhandled type " + type);
|
|
||||||
}
|
|
||||||
skipMdnsRecord(reader, isQuestion);
|
skipMdnsRecord(reader, isQuestion);
|
||||||
return null;
|
return null;
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ import static com.android.server.connectivity.mdns.MdnsRecordRepository.IPV6_ADD
|
|||||||
|
|
||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
|
import android.annotation.RequiresApi;
|
||||||
|
import android.os.Build;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.os.Message;
|
import android.os.Message;
|
||||||
@@ -34,6 +36,7 @@ import java.net.InetSocketAddress;
|
|||||||
* A class used to send several packets at given time intervals.
|
* A class used to send several packets at given time intervals.
|
||||||
* @param <T> The type of the request providing packet repeating parameters.
|
* @param <T> The type of the request providing packet repeating parameters.
|
||||||
*/
|
*/
|
||||||
|
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
|
||||||
public abstract class MdnsPacketRepeater<T extends MdnsPacketRepeater.Request> {
|
public abstract class MdnsPacketRepeater<T extends MdnsPacketRepeater.Request> {
|
||||||
private static final boolean DBG = MdnsAdvertiser.DBG;
|
private static final boolean DBG = MdnsAdvertiser.DBG;
|
||||||
private static final InetSocketAddress[] ALL_ADDRS = new InetSocketAddress[] {
|
private static final InetSocketAddress[] ALL_ADDRS = new InetSocketAddress[] {
|
||||||
|
|||||||
@@ -17,6 +17,8 @@
|
|||||||
package com.android.server.connectivity.mdns;
|
package com.android.server.connectivity.mdns;
|
||||||
|
|
||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
|
import android.annotation.RequiresApi;
|
||||||
|
import android.os.Build;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
|
|
||||||
import com.android.internal.annotations.VisibleForTesting;
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
@@ -33,6 +35,7 @@ import java.util.List;
|
|||||||
*
|
*
|
||||||
* TODO: implement receiving replies and handling conflicts.
|
* TODO: implement receiving replies and handling conflicts.
|
||||||
*/
|
*/
|
||||||
|
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
|
||||||
public class MdnsProber extends MdnsPacketRepeater<MdnsProber.ProbingInfo> {
|
public class MdnsProber extends MdnsPacketRepeater<MdnsProber.ProbingInfo> {
|
||||||
private static final long CONFLICT_RETRY_DELAY_MS = 5_000L;
|
private static final long CONFLICT_RETRY_DELAY_MS = 5_000L;
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ package com.android.server.connectivity.mdns;
|
|||||||
import static com.android.server.connectivity.mdns.util.MdnsUtils.ensureRunningOnHandlerThread;
|
import static com.android.server.connectivity.mdns.util.MdnsUtils.ensureRunningOnHandlerThread;
|
||||||
|
|
||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
|
import android.annotation.RequiresApi;
|
||||||
|
import android.os.Build;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.os.Message;
|
import android.os.Message;
|
||||||
@@ -41,6 +43,7 @@ import java.util.Collections;
|
|||||||
*
|
*
|
||||||
* TODO: implement sending after a delay, combining queued replies and duplicate answer suppression
|
* TODO: implement sending after a delay, combining queued replies and duplicate answer suppression
|
||||||
*/
|
*/
|
||||||
|
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
|
||||||
public class MdnsReplySender {
|
public class MdnsReplySender {
|
||||||
private static final boolean DBG = MdnsAdvertiser.DBG;
|
private static final boolean DBG = MdnsAdvertiser.DBG;
|
||||||
private static final int MSG_SEND = 1;
|
private static final int MSG_SEND = 1;
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ import android.annotation.NonNull;
|
|||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
import android.net.Network;
|
import android.net.Network;
|
||||||
import android.util.ArrayMap;
|
import android.util.ArrayMap;
|
||||||
import android.util.ArraySet;
|
|
||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
|
|
||||||
import com.android.server.connectivity.mdns.util.MdnsUtils;
|
import com.android.server.connectivity.mdns.util.MdnsUtils;
|
||||||
@@ -29,6 +28,7 @@ import java.io.EOFException;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/** A class that decodes mDNS responses from UDP packets. */
|
/** A class that decodes mDNS responses from UDP packets. */
|
||||||
public class MdnsResponseDecoder {
|
public class MdnsResponseDecoder {
|
||||||
@@ -125,7 +125,7 @@ public class MdnsResponseDecoder {
|
|||||||
* 2) A copy of the original responses with some of them have records
|
* 2) A copy of the original responses with some of them have records
|
||||||
* update or only contains receive time updated.
|
* update or only contains receive time updated.
|
||||||
*/
|
*/
|
||||||
public Pair<ArraySet<MdnsResponse>, ArrayList<MdnsResponse>> augmentResponses(
|
public Pair<Set<MdnsResponse>, ArrayList<MdnsResponse>> augmentResponses(
|
||||||
@NonNull MdnsPacket mdnsPacket,
|
@NonNull MdnsPacket mdnsPacket,
|
||||||
@NonNull Collection<MdnsResponse> existingResponses, int interfaceIndex,
|
@NonNull Collection<MdnsResponse> existingResponses, int interfaceIndex,
|
||||||
@Nullable Network network) {
|
@Nullable Network network) {
|
||||||
@@ -136,7 +136,7 @@ public class MdnsResponseDecoder {
|
|||||||
records.addAll(mdnsPacket.authorityRecords);
|
records.addAll(mdnsPacket.authorityRecords);
|
||||||
records.addAll(mdnsPacket.additionalRecords);
|
records.addAll(mdnsPacket.additionalRecords);
|
||||||
|
|
||||||
final ArraySet<MdnsResponse> modified = new ArraySet<>();
|
final Set<MdnsResponse> modified = MdnsUtils.newSet();
|
||||||
final ArrayList<MdnsResponse> responses = new ArrayList<>(existingResponses.size());
|
final ArrayList<MdnsResponse> responses = new ArrayList<>(existingResponses.size());
|
||||||
final ArrayMap<MdnsResponse, MdnsResponse> augmentedToOriginal = new ArrayMap<>();
|
final ArrayMap<MdnsResponse, MdnsResponse> augmentedToOriginal = new ArrayMap<>();
|
||||||
for (MdnsResponse existing : existingResponses) {
|
for (MdnsResponse existing : existingResponses) {
|
||||||
|
|||||||
@@ -22,7 +22,8 @@ import android.net.Network;
|
|||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.ArraySet;
|
|
||||||
|
import com.android.server.connectivity.mdns.util.MdnsUtils;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@@ -46,11 +47,11 @@ public class MdnsSearchOptions implements Parcelable {
|
|||||||
public MdnsSearchOptions createFromParcel(Parcel source) {
|
public MdnsSearchOptions createFromParcel(Parcel source) {
|
||||||
return new MdnsSearchOptions(
|
return new MdnsSearchOptions(
|
||||||
source.createStringArrayList(),
|
source.createStringArrayList(),
|
||||||
source.readBoolean(),
|
source.readInt() == 1,
|
||||||
source.readBoolean(),
|
source.readInt() == 1,
|
||||||
source.readParcelable(null),
|
source.readParcelable(null),
|
||||||
source.readString(),
|
source.readString(),
|
||||||
source.readBoolean(),
|
source.readInt() == 1,
|
||||||
source.readInt());
|
source.readInt());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,11 +166,11 @@ public class MdnsSearchOptions implements Parcelable {
|
|||||||
@Override
|
@Override
|
||||||
public void writeToParcel(Parcel out, int flags) {
|
public void writeToParcel(Parcel out, int flags) {
|
||||||
out.writeStringList(subtypes);
|
out.writeStringList(subtypes);
|
||||||
out.writeBoolean(isPassiveMode);
|
out.writeInt(isPassiveMode ? 1 : 0);
|
||||||
out.writeBoolean(removeExpiredService);
|
out.writeInt(removeExpiredService ? 1 : 0);
|
||||||
out.writeParcelable(mNetwork, 0);
|
out.writeParcelable(mNetwork, 0);
|
||||||
out.writeString(resolveInstanceName);
|
out.writeString(resolveInstanceName);
|
||||||
out.writeBoolean(onlyUseIpv6OnIpv6OnlyNetworks);
|
out.writeInt(onlyUseIpv6OnIpv6OnlyNetworks ? 1 : 0);
|
||||||
out.writeInt(numOfQueriesBeforeBackoff);
|
out.writeInt(numOfQueriesBeforeBackoff);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -184,7 +185,7 @@ public class MdnsSearchOptions implements Parcelable {
|
|||||||
private String resolveInstanceName;
|
private String resolveInstanceName;
|
||||||
|
|
||||||
private Builder() {
|
private Builder() {
|
||||||
subtypes = new ArraySet<>();
|
subtypes = MdnsUtils.newSet();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ import android.os.Looper;
|
|||||||
import android.os.Message;
|
import android.os.Message;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.ArrayMap;
|
import android.util.ArrayMap;
|
||||||
import android.util.ArraySet;
|
|
||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
|
|
||||||
import com.android.internal.annotations.VisibleForTesting;
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
@@ -42,6 +41,7 @@ import java.util.Arrays;
|
|||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.concurrent.ScheduledExecutorService;
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -414,11 +414,11 @@ public class MdnsServiceTypeClient {
|
|||||||
currentList.add(additionalResponse);
|
currentList.add(additionalResponse);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final Pair<ArraySet<MdnsResponse>, ArrayList<MdnsResponse>> augmentedResult =
|
final Pair<Set<MdnsResponse>, ArrayList<MdnsResponse>> augmentedResult =
|
||||||
responseDecoder.augmentResponses(packet, currentList,
|
responseDecoder.augmentResponses(packet, currentList,
|
||||||
socketKey.getInterfaceIndex(), socketKey.getNetwork());
|
socketKey.getInterfaceIndex(), socketKey.getNetwork());
|
||||||
|
|
||||||
final ArraySet<MdnsResponse> modifiedResponse = augmentedResult.first;
|
final Set<MdnsResponse> modifiedResponse = augmentedResult.first;
|
||||||
final ArrayList<MdnsResponse> allResponses = augmentedResult.second;
|
final ArrayList<MdnsResponse> allResponses = augmentedResult.second;
|
||||||
|
|
||||||
for (MdnsResponse response : allResponses) {
|
for (MdnsResponse response : allResponses) {
|
||||||
|
|||||||
@@ -19,12 +19,12 @@ package com.android.server.connectivity.mdns;
|
|||||||
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
|
import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
|
||||||
import static android.net.NetworkCapabilities.TRANSPORT_VPN;
|
import static android.net.NetworkCapabilities.TRANSPORT_VPN;
|
||||||
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
|
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
|
||||||
|
|
||||||
import static com.android.server.connectivity.mdns.util.MdnsUtils.ensureRunningOnHandlerThread;
|
import static com.android.server.connectivity.mdns.util.MdnsUtils.ensureRunningOnHandlerThread;
|
||||||
import static com.android.server.connectivity.mdns.util.MdnsUtils.isNetworkMatched;
|
import static com.android.server.connectivity.mdns.util.MdnsUtils.isNetworkMatched;
|
||||||
|
|
||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
|
import android.annotation.RequiresApi;
|
||||||
import android.content.BroadcastReceiver;
|
import android.content.BroadcastReceiver;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
@@ -41,6 +41,7 @@ import android.net.TetheringManager.TetheringEventCallback;
|
|||||||
import android.net.wifi.p2p.WifiP2pGroup;
|
import android.net.wifi.p2p.WifiP2pGroup;
|
||||||
import android.net.wifi.p2p.WifiP2pInfo;
|
import android.net.wifi.p2p.WifiP2pInfo;
|
||||||
import android.net.wifi.p2p.WifiP2pManager;
|
import android.net.wifi.p2p.WifiP2pManager;
|
||||||
|
import android.os.Build;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.util.ArrayMap;
|
import android.util.ArrayMap;
|
||||||
@@ -67,6 +68,7 @@ import java.util.Objects;
|
|||||||
* to their default value (0, false or null).
|
* to their default value (0, false or null).
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
|
||||||
public class MdnsSocketProvider {
|
public class MdnsSocketProvider {
|
||||||
private static final String TAG = MdnsSocketProvider.class.getSimpleName();
|
private static final String TAG = MdnsSocketProvider.class.getSimpleName();
|
||||||
private static final boolean DBG = MdnsDiscoveryManager.DBG;
|
private static final boolean DBG = MdnsDiscoveryManager.DBG;
|
||||||
|
|||||||
@@ -22,9 +22,9 @@ import android.annotation.NonNull;
|
|||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.ParcelFileDescriptor;
|
import android.os.ParcelFileDescriptor;
|
||||||
import android.system.Os;
|
import android.system.Os;
|
||||||
import android.util.ArraySet;
|
|
||||||
|
|
||||||
import com.android.net.module.util.FdEventsReader;
|
import com.android.net.module.util.FdEventsReader;
|
||||||
|
import com.android.server.connectivity.mdns.util.MdnsUtils;
|
||||||
|
|
||||||
import java.io.FileDescriptor;
|
import java.io.FileDescriptor;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
@@ -39,7 +39,7 @@ public class MulticastPacketReader extends FdEventsReader<MulticastPacketReader.
|
|||||||
@NonNull
|
@NonNull
|
||||||
private final Handler mHandler;
|
private final Handler mHandler;
|
||||||
@NonNull
|
@NonNull
|
||||||
private final Set<PacketHandler> mPacketHandlers = new ArraySet<>();
|
private final Set<PacketHandler> mPacketHandlers = MdnsUtils.newSet();
|
||||||
|
|
||||||
interface PacketHandler {
|
interface PacketHandler {
|
||||||
void handlePacket(byte[] recvbuf, int length, InetSocketAddress src);
|
void handlePacket(byte[] recvbuf, int length, InetSocketAddress src);
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package com.android.server.connectivity.mdns.util;
|
|||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
import android.net.Network;
|
import android.net.Network;
|
||||||
|
import android.os.Build;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.util.ArraySet;
|
import android.util.ArraySet;
|
||||||
@@ -34,6 +35,8 @@ import java.nio.CharBuffer;
|
|||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.nio.charset.CharsetEncoder;
|
import java.nio.charset.CharsetEncoder;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mdns utility functions.
|
* Mdns utility functions.
|
||||||
@@ -57,6 +60,17 @@ public class MdnsUtils {
|
|||||||
return new String(outChars);
|
return new String(outChars);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a ArraySet or HashSet based on the sdk version.
|
||||||
|
*/
|
||||||
|
public static <Type> Set<Type> newSet() {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||||
|
return new ArraySet<>();
|
||||||
|
} else {
|
||||||
|
return new HashSet<>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert the array of labels to DNS case-insensitive lowercase.
|
* Convert the array of labels to DNS case-insensitive lowercase.
|
||||||
*/
|
*/
|
||||||
@@ -142,7 +156,7 @@ public class MdnsUtils {
|
|||||||
|
|
||||||
/*** Check whether the target network matches any of the current networks */
|
/*** Check whether the target network matches any of the current networks */
|
||||||
public static boolean isAnyNetworkMatched(@Nullable Network targetNetwork,
|
public static boolean isAnyNetworkMatched(@Nullable Network targetNetwork,
|
||||||
ArraySet<Network> currentNetworks) {
|
Set<Network> currentNetworks) {
|
||||||
if (targetNetwork == null) {
|
if (targetNetwork == null) {
|
||||||
return !currentNetworks.isEmpty();
|
return !currentNetworks.isEmpty();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,10 +17,8 @@
|
|||||||
package com.android.server.connectivity.mdns;
|
package com.android.server.connectivity.mdns;
|
||||||
|
|
||||||
import static android.net.InetAddresses.parseNumericAddress;
|
import static android.net.InetAddresses.parseNumericAddress;
|
||||||
|
|
||||||
import static com.android.server.connectivity.mdns.util.MdnsUtils.Clock;
|
import static com.android.server.connectivity.mdns.util.MdnsUtils.Clock;
|
||||||
import static com.android.testutils.DevSdkIgnoreRuleKt.SC_V2;
|
import static com.android.testutils.DevSdkIgnoreRuleKt.SC_V2;
|
||||||
|
|
||||||
import static org.junit.Assert.assertArrayEquals;
|
import static org.junit.Assert.assertArrayEquals;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
@@ -343,9 +341,9 @@ public class MdnsResponseDecoderTests {
|
|||||||
assertNotNull(parsedPacket);
|
assertNotNull(parsedPacket);
|
||||||
|
|
||||||
final Network network = mock(Network.class);
|
final Network network = mock(Network.class);
|
||||||
responses = decoder.augmentResponses(parsedPacket,
|
responses = new ArraySet<>(decoder.augmentResponses(parsedPacket,
|
||||||
/* existingResponses= */ Collections.emptyList(),
|
/* existingResponses= */ Collections.emptyList(),
|
||||||
/* interfaceIndex= */ 10, network /* expireOnExit= */).first;
|
/* interfaceIndex= */ 10, network /* expireOnExit= */).first);
|
||||||
|
|
||||||
assertEquals(responses.size(), 1);
|
assertEquals(responses.size(), 1);
|
||||||
assertEquals(responses.valueAt(0).getInterfaceIndex(), 10);
|
assertEquals(responses.valueAt(0).getInterfaceIndex(), 10);
|
||||||
@@ -641,8 +639,8 @@ public class MdnsResponseDecoderTests {
|
|||||||
final MdnsPacket parsedPacket = MdnsResponseDecoder.parseResponse(data, data.length);
|
final MdnsPacket parsedPacket = MdnsResponseDecoder.parseResponse(data, data.length);
|
||||||
assertNotNull(parsedPacket);
|
assertNotNull(parsedPacket);
|
||||||
|
|
||||||
return decoder.augmentResponses(parsedPacket,
|
return new ArraySet<>(decoder.augmentResponses(parsedPacket,
|
||||||
existingResponses,
|
existingResponses,
|
||||||
MdnsSocket.INTERFACE_INDEX_UNSPECIFIED, mock(Network.class)).first;
|
MdnsSocket.INTERFACE_INDEX_UNSPECIFIED, mock(Network.class)).first);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user