Merge changes I41743f47,I22577615,I46f806a8,Icaa1df2e
* changes: Put client logs into SharedLog and dump more logs Record Advertiser history logs for better debugging Record SocketProvider history logs for better debugging Record DiscoveryManager history logs for better debugging
This commit is contained in:
@@ -44,6 +44,7 @@ import android.net.nsd.INsdServiceConnector;
|
|||||||
import android.net.nsd.MDnsManager;
|
import android.net.nsd.MDnsManager;
|
||||||
import android.net.nsd.NsdManager;
|
import android.net.nsd.NsdManager;
|
||||||
import android.net.nsd.NsdServiceInfo;
|
import android.net.nsd.NsdServiceInfo;
|
||||||
|
import android.os.Binder;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.HandlerThread;
|
import android.os.HandlerThread;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
@@ -56,10 +57,12 @@ import android.util.Log;
|
|||||||
import android.util.SparseArray;
|
import android.util.SparseArray;
|
||||||
|
|
||||||
import com.android.internal.annotations.VisibleForTesting;
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
|
import com.android.internal.util.IndentingPrintWriter;
|
||||||
import com.android.internal.util.State;
|
import com.android.internal.util.State;
|
||||||
import com.android.internal.util.StateMachine;
|
import com.android.internal.util.StateMachine;
|
||||||
import com.android.net.module.util.DeviceConfigUtils;
|
import com.android.net.module.util.DeviceConfigUtils;
|
||||||
import com.android.net.module.util.PermissionUtils;
|
import com.android.net.module.util.PermissionUtils;
|
||||||
|
import com.android.net.module.util.SharedLog;
|
||||||
import com.android.server.connectivity.mdns.ExecutorProvider;
|
import com.android.server.connectivity.mdns.ExecutorProvider;
|
||||||
import com.android.server.connectivity.mdns.MdnsAdvertiser;
|
import com.android.server.connectivity.mdns.MdnsAdvertiser;
|
||||||
import com.android.server.connectivity.mdns.MdnsDiscoveryManager;
|
import com.android.server.connectivity.mdns.MdnsDiscoveryManager;
|
||||||
@@ -159,6 +162,7 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
private final MdnsSocketProvider mMdnsSocketProvider;
|
private final MdnsSocketProvider mMdnsSocketProvider;
|
||||||
@NonNull
|
@NonNull
|
||||||
private final MdnsAdvertiser mAdvertiser;
|
private final MdnsAdvertiser mAdvertiser;
|
||||||
|
private final SharedLog mServiceLogs = new SharedLog(TAG);
|
||||||
// WARNING : Accessing these values in any thread is not safe, it must only be changed in the
|
// WARNING : Accessing these values in any thread is not safe, it must only be changed in the
|
||||||
// state machine thread. If change this outside state machine, it will need to introduce
|
// state machine thread. If change this outside state machine, it will need to introduce
|
||||||
// synchronization.
|
// synchronization.
|
||||||
@@ -179,6 +183,8 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
private int mUniqueId = 1;
|
private int mUniqueId = 1;
|
||||||
// The count of the connected legacy clients.
|
// The count of the connected legacy clients.
|
||||||
private int mLegacyClientCount = 0;
|
private int mLegacyClientCount = 0;
|
||||||
|
// The number of client that ever connected.
|
||||||
|
private int mClientNumberId = 1;
|
||||||
|
|
||||||
private static class MdnsListener implements MdnsServiceBrowserListener {
|
private static class MdnsListener implements MdnsServiceBrowserListener {
|
||||||
protected final int mClientId;
|
protected final int mClientId;
|
||||||
@@ -332,6 +338,7 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
mMDnsManager.startDaemon();
|
mMDnsManager.startDaemon();
|
||||||
mIsDaemonStarted = true;
|
mIsDaemonStarted = true;
|
||||||
maybeScheduleStop();
|
maybeScheduleStop();
|
||||||
|
mServiceLogs.log("Start mdns_responder daemon");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void maybeStopDaemon() {
|
private void maybeStopDaemon() {
|
||||||
@@ -342,6 +349,7 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
mMDnsManager.unregisterEventListener(mMDnsEventCallback);
|
mMDnsManager.unregisterEventListener(mMDnsEventCallback);
|
||||||
mMDnsManager.stopDaemon();
|
mMDnsManager.stopDaemon();
|
||||||
mIsDaemonStarted = false;
|
mIsDaemonStarted = false;
|
||||||
|
mServiceLogs.log("Stop mdns_responder daemon");
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isAnyRequestActive() {
|
private boolean isAnyRequestActive() {
|
||||||
@@ -401,7 +409,9 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
final INsdManagerCallback cb = arg.callback;
|
final INsdManagerCallback cb = arg.callback;
|
||||||
try {
|
try {
|
||||||
cb.asBinder().linkToDeath(arg.connector, 0);
|
cb.asBinder().linkToDeath(arg.connector, 0);
|
||||||
cInfo = new ClientInfo(cb, arg.useJavaBackend);
|
final String tag = "Client" + arg.uid + "-" + mClientNumberId++;
|
||||||
|
cInfo = new ClientInfo(cb, arg.useJavaBackend,
|
||||||
|
mServiceLogs.forSubComponent(tag));
|
||||||
mClients.put(arg.connector, cInfo);
|
mClients.put(arg.connector, cInfo);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
Log.w(TAG, "Client " + clientId + " has already died");
|
Log.w(TAG, "Client " + clientId + " has already died");
|
||||||
@@ -628,6 +638,8 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
listenServiceType, listener, options);
|
listenServiceType, listener, options);
|
||||||
storeDiscoveryManagerRequestMap(clientId, id, listener, clientInfo);
|
storeDiscoveryManagerRequestMap(clientId, id, listener, clientInfo);
|
||||||
clientInfo.onDiscoverServicesStarted(clientId, info);
|
clientInfo.onDiscoverServicesStarted(clientId, info);
|
||||||
|
clientInfo.log("Register a DiscoveryListener " + id
|
||||||
|
+ " for service type:" + listenServiceType);
|
||||||
} else {
|
} else {
|
||||||
maybeStartDaemon();
|
maybeStartDaemon();
|
||||||
if (discoverServices(id, info)) {
|
if (discoverServices(id, info)) {
|
||||||
@@ -669,6 +681,7 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
if (request instanceof DiscoveryManagerRequest) {
|
if (request instanceof DiscoveryManagerRequest) {
|
||||||
stopDiscoveryManagerRequest(request, clientId, id, clientInfo);
|
stopDiscoveryManagerRequest(request, clientId, id, clientInfo);
|
||||||
clientInfo.onStopDiscoverySucceeded(clientId);
|
clientInfo.onStopDiscoverySucceeded(clientId);
|
||||||
|
clientInfo.log("Unregister the DiscoveryListener " + id);
|
||||||
} else {
|
} else {
|
||||||
removeRequestMap(clientId, id, clientInfo);
|
removeRequestMap(clientId, id, clientInfo);
|
||||||
if (stopServiceDiscovery(id)) {
|
if (stopServiceDiscovery(id)) {
|
||||||
@@ -804,6 +817,8 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
mMdnsDiscoveryManager.registerListener(
|
mMdnsDiscoveryManager.registerListener(
|
||||||
resolveServiceType, listener, options);
|
resolveServiceType, listener, options);
|
||||||
storeDiscoveryManagerRequestMap(clientId, id, listener, clientInfo);
|
storeDiscoveryManagerRequestMap(clientId, id, listener, clientInfo);
|
||||||
|
clientInfo.log("Register a ResolutionListener " + id
|
||||||
|
+ " for service type:" + resolveServiceType);
|
||||||
} else {
|
} else {
|
||||||
if (clientInfo.mResolvedService != null) {
|
if (clientInfo.mResolvedService != null) {
|
||||||
clientInfo.onResolveServiceFailed(
|
clientInfo.onResolveServiceFailed(
|
||||||
@@ -846,6 +861,7 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
if (request instanceof DiscoveryManagerRequest) {
|
if (request instanceof DiscoveryManagerRequest) {
|
||||||
stopDiscoveryManagerRequest(request, clientId, id, clientInfo);
|
stopDiscoveryManagerRequest(request, clientId, id, clientInfo);
|
||||||
clientInfo.onStopResolutionSucceeded(clientId);
|
clientInfo.onStopResolutionSucceeded(clientId);
|
||||||
|
clientInfo.log("Unregister the ResolutionListener " + id);
|
||||||
} else {
|
} else {
|
||||||
removeRequestMap(clientId, id, clientInfo);
|
removeRequestMap(clientId, id, clientInfo);
|
||||||
if (stopResolveService(id)) {
|
if (stopResolveService(id)) {
|
||||||
@@ -891,6 +907,8 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
mMdnsDiscoveryManager.registerListener(
|
mMdnsDiscoveryManager.registerListener(
|
||||||
resolveServiceType, listener, options);
|
resolveServiceType, listener, options);
|
||||||
storeDiscoveryManagerRequestMap(clientId, id, listener, clientInfo);
|
storeDiscoveryManagerRequestMap(clientId, id, listener, clientInfo);
|
||||||
|
clientInfo.log("Register a ServiceInfoListener " + id
|
||||||
|
+ " for service type:" + resolveServiceType);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case NsdManager.UNREGISTER_SERVICE_CALLBACK: {
|
case NsdManager.UNREGISTER_SERVICE_CALLBACK: {
|
||||||
@@ -914,6 +932,7 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
if (request instanceof DiscoveryManagerRequest) {
|
if (request instanceof DiscoveryManagerRequest) {
|
||||||
stopDiscoveryManagerRequest(request, clientId, id, clientInfo);
|
stopDiscoveryManagerRequest(request, clientId, id, clientInfo);
|
||||||
clientInfo.onServiceInfoCallbackUnregistered(clientId);
|
clientInfo.onServiceInfoCallbackUnregistered(clientId);
|
||||||
|
clientInfo.log("Unregister the ServiceInfoListener " + id);
|
||||||
} else {
|
} else {
|
||||||
loge("Unregister failed with non-DiscoveryManagerRequest.");
|
loge("Unregister failed with non-DiscoveryManagerRequest.");
|
||||||
}
|
}
|
||||||
@@ -1545,12 +1564,14 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
@NonNull public final NsdServiceConnector connector;
|
@NonNull public final NsdServiceConnector connector;
|
||||||
@NonNull public final INsdManagerCallback callback;
|
@NonNull public final INsdManagerCallback callback;
|
||||||
public final boolean useJavaBackend;
|
public final boolean useJavaBackend;
|
||||||
|
public final int uid;
|
||||||
|
|
||||||
ConnectorArgs(@NonNull NsdServiceConnector connector, @NonNull INsdManagerCallback callback,
|
ConnectorArgs(@NonNull NsdServiceConnector connector, @NonNull INsdManagerCallback callback,
|
||||||
boolean useJavaBackend) {
|
boolean useJavaBackend, int uid) {
|
||||||
this.connector = connector;
|
this.connector = connector;
|
||||||
this.callback = callback;
|
this.callback = callback;
|
||||||
this.useJavaBackend = useJavaBackend;
|
this.useJavaBackend = useJavaBackend;
|
||||||
|
this.uid = uid;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1559,9 +1580,9 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.INTERNET, "NsdService");
|
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.INTERNET, "NsdService");
|
||||||
if (DBG) Log.d(TAG, "New client connect. useJavaBackend=" + useJavaBackend);
|
if (DBG) Log.d(TAG, "New client connect. useJavaBackend=" + useJavaBackend);
|
||||||
final INsdServiceConnector connector = new NsdServiceConnector();
|
final INsdServiceConnector connector = new NsdServiceConnector();
|
||||||
mNsdStateMachine.sendMessage(mNsdStateMachine.obtainMessage(
|
mNsdStateMachine.sendMessage(mNsdStateMachine.obtainMessage(NsdManager.REGISTER_CLIENT,
|
||||||
NsdManager.REGISTER_CLIENT,
|
new ConnectorArgs((NsdServiceConnector) connector, cb, useJavaBackend,
|
||||||
new ConnectorArgs((NsdServiceConnector) connector, cb, useJavaBackend)));
|
Binder.getCallingUid())));
|
||||||
return connector;
|
return connector;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1760,15 +1781,39 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
|
public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
|
||||||
if (!PermissionUtils.checkDumpPermission(mContext, TAG, pw)) return;
|
if (!PermissionUtils.checkDumpPermission(mContext, TAG, writer)) return;
|
||||||
|
|
||||||
for (ClientInfo client : mClients.values()) {
|
|
||||||
pw.println("Client Info");
|
|
||||||
pw.println(client);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
final IndentingPrintWriter pw = new IndentingPrintWriter(writer, " ");
|
||||||
|
// Dump state machine logs
|
||||||
mNsdStateMachine.dump(fd, pw, args);
|
mNsdStateMachine.dump(fd, pw, args);
|
||||||
|
|
||||||
|
// Dump service and clients logs
|
||||||
|
pw.println();
|
||||||
|
pw.increaseIndent();
|
||||||
|
mServiceLogs.reverseDump(pw);
|
||||||
|
pw.decreaseIndent();
|
||||||
|
|
||||||
|
// Dump advertiser related logs
|
||||||
|
pw.println();
|
||||||
|
pw.println("Advertiser:");
|
||||||
|
pw.increaseIndent();
|
||||||
|
mAdvertiser.dump(pw);
|
||||||
|
pw.decreaseIndent();
|
||||||
|
|
||||||
|
// Dump discoverymanager related logs
|
||||||
|
pw.println();
|
||||||
|
pw.println("DiscoveryManager:");
|
||||||
|
pw.increaseIndent();
|
||||||
|
mMdnsDiscoveryManager.dump(pw);
|
||||||
|
pw.decreaseIndent();
|
||||||
|
|
||||||
|
// Dump socketprovider related logs
|
||||||
|
pw.println();
|
||||||
|
pw.println("SocketProvider:");
|
||||||
|
pw.increaseIndent();
|
||||||
|
mMdnsSocketProvider.dump(pw);
|
||||||
|
pw.decreaseIndent();
|
||||||
}
|
}
|
||||||
|
|
||||||
private abstract static class ClientRequest {
|
private abstract static class ClientRequest {
|
||||||
@@ -1819,11 +1864,14 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
private boolean mIsPreSClient = false;
|
private boolean mIsPreSClient = false;
|
||||||
// The flag of using java backend if the client's target SDK >= U
|
// The flag of using java backend if the client's target SDK >= U
|
||||||
private final boolean mUseJavaBackend;
|
private final boolean mUseJavaBackend;
|
||||||
|
// Store client logs
|
||||||
|
private final SharedLog mClientLogs;
|
||||||
|
|
||||||
private ClientInfo(INsdManagerCallback cb, boolean useJavaBackend) {
|
private ClientInfo(INsdManagerCallback cb, boolean useJavaBackend, SharedLog sharedLog) {
|
||||||
mCb = cb;
|
mCb = cb;
|
||||||
mUseJavaBackend = useJavaBackend;
|
mUseJavaBackend = useJavaBackend;
|
||||||
if (DBG) Log.d(TAG, "New client");
|
mClientLogs = sharedLog;
|
||||||
|
mClientLogs.log("New client. useJavaBackend=" + useJavaBackend);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1861,6 +1909,7 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
// Remove any pending requests from the global map when we get rid of a client,
|
// Remove any pending requests from the global map when we get rid of a client,
|
||||||
// and send cancellations to the daemon.
|
// and send cancellations to the daemon.
|
||||||
private void expungeAllRequests() {
|
private void expungeAllRequests() {
|
||||||
|
mClientLogs.log("Client unregistered. expungeAllRequests!");
|
||||||
// TODO: to keep handler responsive, do not clean all requests for that client at once.
|
// TODO: to keep handler responsive, do not clean all requests for that client at once.
|
||||||
for (int i = 0; i < mClientRequests.size(); i++) {
|
for (int i = 0; i < mClientRequests.size(); i++) {
|
||||||
final int clientId = mClientRequests.keyAt(i);
|
final int clientId = mClientRequests.keyAt(i);
|
||||||
@@ -1915,6 +1964,10 @@ public class NsdService extends INsdManager.Stub {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void log(String message) {
|
||||||
|
mClientLogs.log(message);
|
||||||
|
}
|
||||||
|
|
||||||
void onDiscoverServicesStarted(int listenerKey, NsdServiceInfo info) {
|
void onDiscoverServicesStarted(int listenerKey, NsdServiceInfo info) {
|
||||||
try {
|
try {
|
||||||
mCb.onDiscoverServicesStarted(listenerKey, info);
|
mCb.onDiscoverServicesStarted(listenerKey, info);
|
||||||
|
|||||||
@@ -28,7 +28,9 @@ import android.util.Log;
|
|||||||
import android.util.SparseArray;
|
import android.util.SparseArray;
|
||||||
|
|
||||||
import com.android.internal.annotations.VisibleForTesting;
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
|
import com.android.net.module.util.SharedLog;
|
||||||
|
|
||||||
|
import java.io.PrintWriter;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
@@ -46,6 +48,7 @@ public class MdnsAdvertiser {
|
|||||||
|
|
||||||
// Top-level domain for link-local queries, as per RFC6762 3.
|
// Top-level domain for link-local queries, as per RFC6762 3.
|
||||||
private static final String LOCAL_TLD = "local";
|
private static final String LOCAL_TLD = "local";
|
||||||
|
private static final SharedLog LOGGER = new SharedLog(TAG);
|
||||||
|
|
||||||
private final Looper mLooper;
|
private final Looper mLooper;
|
||||||
private final AdvertiserCallback mCb;
|
private final AdvertiserCallback mCb;
|
||||||
@@ -82,7 +85,7 @@ public class MdnsAdvertiser {
|
|||||||
// Note NetworkInterface is final and not mockable
|
// Note NetworkInterface is final and not mockable
|
||||||
final String logTag = socket.getInterface().getName();
|
final String logTag = socket.getInterface().getName();
|
||||||
return new MdnsInterfaceAdvertiser(logTag, socket, initialAddresses, looper,
|
return new MdnsInterfaceAdvertiser(logTag, socket, initialAddresses, looper,
|
||||||
packetCreationBuffer, cb, deviceHostName);
|
packetCreationBuffer, cb, deviceHostName, LOGGER.forSubComponent(logTag));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -129,9 +132,7 @@ public class MdnsAdvertiser {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onServiceConflict(@NonNull MdnsInterfaceAdvertiser advertiser, int serviceId) {
|
public void onServiceConflict(@NonNull MdnsInterfaceAdvertiser advertiser, int serviceId) {
|
||||||
if (DBG) {
|
LOGGER.i("Found conflict, restarted probing for service " + serviceId);
|
||||||
Log.v(TAG, "Found conflict, restarted probing for service " + serviceId);
|
|
||||||
}
|
|
||||||
|
|
||||||
final Registration registration = mRegistrations.get(serviceId);
|
final Registration registration = mRegistrations.get(serviceId);
|
||||||
if (registration == null) return;
|
if (registration == null) return;
|
||||||
@@ -439,9 +440,7 @@ public class MdnsAdvertiser {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (DBG) {
|
LOGGER.i("Adding service " + service + " with ID " + id);
|
||||||
Log.i(TAG, "Adding service " + service + " with ID " + id);
|
|
||||||
}
|
|
||||||
|
|
||||||
final Network network = service.getNetwork();
|
final Network network = service.getNetwork();
|
||||||
final Registration registration = new Registration(service);
|
final Registration registration = new Registration(service);
|
||||||
@@ -473,9 +472,7 @@ public class MdnsAdvertiser {
|
|||||||
public void removeService(int id) {
|
public void removeService(int id) {
|
||||||
checkThread();
|
checkThread();
|
||||||
if (!mRegistrations.contains(id)) return;
|
if (!mRegistrations.contains(id)) return;
|
||||||
if (DBG) {
|
LOGGER.i("Removing service with ID " + id);
|
||||||
Log.i(TAG, "Removing service with ID " + id);
|
|
||||||
}
|
|
||||||
for (int i = mAdvertiserRequests.size() - 1; i >= 0; i--) {
|
for (int i = mAdvertiserRequests.size() - 1; i >= 0; i--) {
|
||||||
final InterfaceAdvertiserRequest advertiser = mAdvertiserRequests.valueAt(i);
|
final InterfaceAdvertiserRequest advertiser = mAdvertiserRequests.valueAt(i);
|
||||||
advertiser.removeService(id);
|
advertiser.removeService(id);
|
||||||
@@ -487,6 +484,10 @@ public class MdnsAdvertiser {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Dump info to dumpsys */
|
||||||
|
public void dump(PrintWriter pw) {
|
||||||
|
LOGGER.reverseDump(pw);
|
||||||
|
}
|
||||||
private static <K, V> boolean any(@NonNull ArrayMap<K, V> map,
|
private static <K, V> boolean any(@NonNull ArrayMap<K, V> map,
|
||||||
@NonNull BiPredicate<K, V> predicate) {
|
@NonNull BiPredicate<K, V> predicate) {
|
||||||
for (int i = 0; i < map.size(); i++) {
|
for (int i = 0; i < map.size(); i++) {
|
||||||
|
|||||||
@@ -23,16 +23,16 @@ import android.annotation.NonNull;
|
|||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
import android.annotation.RequiresPermission;
|
import android.annotation.RequiresPermission;
|
||||||
import android.net.Network;
|
import android.net.Network;
|
||||||
import android.text.TextUtils;
|
|
||||||
import android.util.ArrayMap;
|
import android.util.ArrayMap;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
|
|
||||||
import com.android.internal.annotations.GuardedBy;
|
import com.android.internal.annotations.GuardedBy;
|
||||||
import com.android.internal.annotations.VisibleForTesting;
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
import com.android.server.connectivity.mdns.util.MdnsLogger;
|
import com.android.net.module.util.SharedLog;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.PrintWriter;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -43,7 +43,7 @@ import java.util.List;
|
|||||||
public class MdnsDiscoveryManager implements MdnsSocketClientBase.Callback {
|
public class MdnsDiscoveryManager implements MdnsSocketClientBase.Callback {
|
||||||
private static final String TAG = MdnsDiscoveryManager.class.getSimpleName();
|
private static final String TAG = MdnsDiscoveryManager.class.getSimpleName();
|
||||||
public static final boolean DBG = Log.isLoggable(TAG, Log.DEBUG);
|
public static final boolean DBG = Log.isLoggable(TAG, Log.DEBUG);
|
||||||
private static final MdnsLogger LOGGER = new MdnsLogger("MdnsDiscoveryManager");
|
private static final SharedLog LOGGER = new SharedLog(TAG);
|
||||||
|
|
||||||
private final ExecutorProvider executorProvider;
|
private final ExecutorProvider executorProvider;
|
||||||
private final MdnsSocketClientBase socketClient;
|
private final MdnsSocketClientBase socketClient;
|
||||||
@@ -120,9 +120,7 @@ public class MdnsDiscoveryManager implements MdnsSocketClientBase.Callback {
|
|||||||
@NonNull String serviceType,
|
@NonNull String serviceType,
|
||||||
@NonNull MdnsServiceBrowserListener listener,
|
@NonNull MdnsServiceBrowserListener listener,
|
||||||
@NonNull MdnsSearchOptions searchOptions) {
|
@NonNull MdnsSearchOptions searchOptions) {
|
||||||
LOGGER.log(
|
LOGGER.i("Registering listener for serviceType: " + serviceType);
|
||||||
"Registering listener for subtypes: %s",
|
|
||||||
TextUtils.join(",", searchOptions.getSubtypes()));
|
|
||||||
if (perNetworkServiceTypeClients.isEmpty()) {
|
if (perNetworkServiceTypeClients.isEmpty()) {
|
||||||
// First listener. Starts the socket client.
|
// First listener. Starts the socket client.
|
||||||
try {
|
try {
|
||||||
@@ -157,8 +155,7 @@ public class MdnsDiscoveryManager implements MdnsSocketClientBase.Callback {
|
|||||||
@RequiresPermission(permission.CHANGE_WIFI_MULTICAST_STATE)
|
@RequiresPermission(permission.CHANGE_WIFI_MULTICAST_STATE)
|
||||||
public synchronized void unregisterListener(
|
public synchronized void unregisterListener(
|
||||||
@NonNull String serviceType, @NonNull MdnsServiceBrowserListener listener) {
|
@NonNull String serviceType, @NonNull MdnsServiceBrowserListener listener) {
|
||||||
LOGGER.log("Unregistering listener for service type: %s", serviceType);
|
LOGGER.i("Unregistering listener for serviceType:" + serviceType);
|
||||||
if (DBG) Log.d(TAG, "Unregistering listener for serviceType:" + serviceType);
|
|
||||||
final List<MdnsServiceTypeClient> serviceTypeClients =
|
final List<MdnsServiceTypeClient> serviceTypeClients =
|
||||||
perNetworkServiceTypeClients.getByServiceType(serviceType);
|
perNetworkServiceTypeClients.getByServiceType(serviceType);
|
||||||
if (serviceTypeClients.isEmpty()) {
|
if (serviceTypeClients.isEmpty()) {
|
||||||
@@ -198,11 +195,19 @@ public class MdnsDiscoveryManager implements MdnsSocketClientBase.Callback {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Dump info to dumpsys */
|
||||||
|
public void dump(PrintWriter pw) {
|
||||||
|
LOGGER.reverseDump(pw);
|
||||||
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
MdnsServiceTypeClient createServiceTypeClient(@NonNull String serviceType,
|
MdnsServiceTypeClient createServiceTypeClient(@NonNull String serviceType,
|
||||||
@Nullable Network network) {
|
@Nullable Network network) {
|
||||||
|
LOGGER.log("createServiceTypeClient for serviceType:" + serviceType
|
||||||
|
+ " network:" + network);
|
||||||
return new MdnsServiceTypeClient(
|
return new MdnsServiceTypeClient(
|
||||||
serviceType, socketClient,
|
serviceType, socketClient,
|
||||||
executorProvider.newServiceTypeClientSchedulerExecutor(), network);
|
executorProvider.newServiceTypeClientSchedulerExecutor(), network,
|
||||||
|
LOGGER.forSubComponent(serviceType + "-" + network));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -26,6 +26,7 @@ import android.util.Log;
|
|||||||
|
|
||||||
import com.android.internal.annotations.VisibleForTesting;
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
import com.android.net.module.util.HexDump;
|
import com.android.net.module.util.HexDump;
|
||||||
|
import com.android.net.module.util.SharedLog;
|
||||||
import com.android.server.connectivity.mdns.MdnsAnnouncer.BaseAnnouncementInfo;
|
import com.android.server.connectivity.mdns.MdnsAnnouncer.BaseAnnouncementInfo;
|
||||||
import com.android.server.connectivity.mdns.MdnsPacketRepeater.PacketRepeaterCallback;
|
import com.android.server.connectivity.mdns.MdnsPacketRepeater.PacketRepeaterCallback;
|
||||||
|
|
||||||
@@ -62,6 +63,9 @@ public class MdnsInterfaceAdvertiser implements MulticastPacketReader.PacketHand
|
|||||||
@NonNull
|
@NonNull
|
||||||
private final MdnsReplySender mReplySender;
|
private final MdnsReplySender mReplySender;
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
private final SharedLog mSharedLog;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Callbacks called by {@link MdnsInterfaceAdvertiser} to report status updates.
|
* Callbacks called by {@link MdnsInterfaceAdvertiser} to report status updates.
|
||||||
*/
|
*/
|
||||||
@@ -96,15 +100,13 @@ public class MdnsInterfaceAdvertiser implements MulticastPacketReader.PacketHand
|
|||||||
@Override
|
@Override
|
||||||
public void onFinished(MdnsProber.ProbingInfo info) {
|
public void onFinished(MdnsProber.ProbingInfo info) {
|
||||||
final MdnsAnnouncer.AnnouncementInfo announcementInfo;
|
final MdnsAnnouncer.AnnouncementInfo announcementInfo;
|
||||||
if (DBG) {
|
mSharedLog.i("Probing finished for service " + info.getServiceId());
|
||||||
Log.v(mTag, "Probing finished for service " + info.getServiceId());
|
|
||||||
}
|
|
||||||
mCbHandler.post(() -> mCb.onRegisterServiceSucceeded(
|
mCbHandler.post(() -> mCb.onRegisterServiceSucceeded(
|
||||||
MdnsInterfaceAdvertiser.this, info.getServiceId()));
|
MdnsInterfaceAdvertiser.this, info.getServiceId()));
|
||||||
try {
|
try {
|
||||||
announcementInfo = mRecordRepository.onProbingSucceeded(info);
|
announcementInfo = mRecordRepository.onProbingSucceeded(info);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Log.e(mTag, "Error building announcements", e);
|
mSharedLog.e("Error building announcements", e);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -171,15 +173,16 @@ public class MdnsInterfaceAdvertiser implements MulticastPacketReader.PacketHand
|
|||||||
public MdnsInterfaceAdvertiser(@NonNull String logTag,
|
public MdnsInterfaceAdvertiser(@NonNull String logTag,
|
||||||
@NonNull MdnsInterfaceSocket socket, @NonNull List<LinkAddress> initialAddresses,
|
@NonNull MdnsInterfaceSocket socket, @NonNull List<LinkAddress> initialAddresses,
|
||||||
@NonNull Looper looper, @NonNull byte[] packetCreationBuffer, @NonNull Callback cb,
|
@NonNull Looper looper, @NonNull byte[] packetCreationBuffer, @NonNull Callback cb,
|
||||||
@NonNull String[] deviceHostName) {
|
@NonNull String[] deviceHostName, @NonNull SharedLog sharedLog) {
|
||||||
this(logTag, socket, initialAddresses, looper, packetCreationBuffer, cb,
|
this(logTag, socket, initialAddresses, looper, packetCreationBuffer, cb,
|
||||||
new Dependencies(), deviceHostName);
|
new Dependencies(), deviceHostName, sharedLog);
|
||||||
}
|
}
|
||||||
|
|
||||||
public MdnsInterfaceAdvertiser(@NonNull String logTag,
|
public MdnsInterfaceAdvertiser(@NonNull String logTag,
|
||||||
@NonNull MdnsInterfaceSocket socket, @NonNull List<LinkAddress> initialAddresses,
|
@NonNull MdnsInterfaceSocket socket, @NonNull List<LinkAddress> initialAddresses,
|
||||||
@NonNull Looper looper, @NonNull byte[] packetCreationBuffer, @NonNull Callback cb,
|
@NonNull Looper looper, @NonNull byte[] packetCreationBuffer, @NonNull Callback cb,
|
||||||
@NonNull Dependencies deps, @NonNull String[] deviceHostName) {
|
@NonNull Dependencies deps, @NonNull String[] deviceHostName,
|
||||||
|
@NonNull SharedLog sharedLog) {
|
||||||
mTag = MdnsInterfaceAdvertiser.class.getSimpleName() + "/" + logTag;
|
mTag = MdnsInterfaceAdvertiser.class.getSimpleName() + "/" + logTag;
|
||||||
mRecordRepository = deps.makeRecordRepository(looper, deviceHostName);
|
mRecordRepository = deps.makeRecordRepository(looper, deviceHostName);
|
||||||
mRecordRepository.updateAddresses(initialAddresses);
|
mRecordRepository.updateAddresses(initialAddresses);
|
||||||
@@ -190,6 +193,7 @@ public class MdnsInterfaceAdvertiser implements MulticastPacketReader.PacketHand
|
|||||||
mAnnouncer = deps.makeMdnsAnnouncer(logTag, looper, mReplySender,
|
mAnnouncer = deps.makeMdnsAnnouncer(logTag, looper, mReplySender,
|
||||||
mAnnouncingCallback);
|
mAnnouncingCallback);
|
||||||
mProber = deps.makeMdnsProber(logTag, looper, mReplySender, mProbingCallback);
|
mProber = deps.makeMdnsProber(logTag, looper, mReplySender, mProbingCallback);
|
||||||
|
mSharedLog = sharedLog;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -213,10 +217,8 @@ public class MdnsInterfaceAdvertiser implements MulticastPacketReader.PacketHand
|
|||||||
// Cancel announcements for the existing service. This only happens for exiting services
|
// Cancel announcements for the existing service. This only happens for exiting services
|
||||||
// (so cancelling exiting announcements), as per RecordRepository.addService.
|
// (so cancelling exiting announcements), as per RecordRepository.addService.
|
||||||
if (replacedExitingService >= 0) {
|
if (replacedExitingService >= 0) {
|
||||||
if (DBG) {
|
mSharedLog.i("Service " + replacedExitingService
|
||||||
Log.d(mTag, "Service " + replacedExitingService
|
+ " getting re-added, cancelling exit announcements");
|
||||||
+ " getting re-added, cancelling exit announcements");
|
|
||||||
}
|
|
||||||
mAnnouncer.stop(replacedExitingService);
|
mAnnouncer.stop(replacedExitingService);
|
||||||
}
|
}
|
||||||
mProber.startProbing(mRecordRepository.setServiceProbing(id));
|
mProber.startProbing(mRecordRepository.setServiceProbing(id));
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ import android.util.Pair;
|
|||||||
|
|
||||||
import com.android.internal.annotations.GuardedBy;
|
import com.android.internal.annotations.GuardedBy;
|
||||||
import com.android.internal.annotations.VisibleForTesting;
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
import com.android.server.connectivity.mdns.util.MdnsLogger;
|
import com.android.net.module.util.SharedLog;
|
||||||
|
|
||||||
import java.net.Inet4Address;
|
import java.net.Inet4Address;
|
||||||
import java.net.Inet6Address;
|
import java.net.Inet6Address;
|
||||||
@@ -49,8 +49,6 @@ import java.util.concurrent.ScheduledExecutorService;
|
|||||||
public class MdnsServiceTypeClient {
|
public class MdnsServiceTypeClient {
|
||||||
|
|
||||||
private static final int DEFAULT_MTU = 1500;
|
private static final int DEFAULT_MTU = 1500;
|
||||||
private static final MdnsLogger LOGGER = new MdnsLogger("MdnsServiceTypeClient");
|
|
||||||
|
|
||||||
|
|
||||||
private final String serviceType;
|
private final String serviceType;
|
||||||
private final String[] serviceTypeLabels;
|
private final String[] serviceTypeLabels;
|
||||||
@@ -58,6 +56,7 @@ public class MdnsServiceTypeClient {
|
|||||||
private final MdnsResponseDecoder responseDecoder;
|
private final MdnsResponseDecoder responseDecoder;
|
||||||
private final ScheduledExecutorService executor;
|
private final ScheduledExecutorService executor;
|
||||||
@Nullable private final Network network;
|
@Nullable private final Network network;
|
||||||
|
@NonNull private final SharedLog sharedLog;
|
||||||
private final Object lock = new Object();
|
private final Object lock = new Object();
|
||||||
private final ArrayMap<MdnsServiceBrowserListener, MdnsSearchOptions> listeners =
|
private final ArrayMap<MdnsServiceBrowserListener, MdnsSearchOptions> listeners =
|
||||||
new ArrayMap<>();
|
new ArrayMap<>();
|
||||||
@@ -90,8 +89,10 @@ public class MdnsServiceTypeClient {
|
|||||||
@NonNull String serviceType,
|
@NonNull String serviceType,
|
||||||
@NonNull MdnsSocketClientBase socketClient,
|
@NonNull MdnsSocketClientBase socketClient,
|
||||||
@NonNull ScheduledExecutorService executor,
|
@NonNull ScheduledExecutorService executor,
|
||||||
@Nullable Network network) {
|
@Nullable Network network,
|
||||||
this(serviceType, socketClient, executor, new MdnsResponseDecoder.Clock(), network);
|
@NonNull SharedLog sharedLog) {
|
||||||
|
this(serviceType, socketClient, executor, new MdnsResponseDecoder.Clock(), network,
|
||||||
|
sharedLog);
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
@@ -100,7 +101,8 @@ public class MdnsServiceTypeClient {
|
|||||||
@NonNull MdnsSocketClientBase socketClient,
|
@NonNull MdnsSocketClientBase socketClient,
|
||||||
@NonNull ScheduledExecutorService executor,
|
@NonNull ScheduledExecutorService executor,
|
||||||
@NonNull MdnsResponseDecoder.Clock clock,
|
@NonNull MdnsResponseDecoder.Clock clock,
|
||||||
@Nullable Network network) {
|
@Nullable Network network,
|
||||||
|
@NonNull SharedLog sharedLog) {
|
||||||
this.serviceType = serviceType;
|
this.serviceType = serviceType;
|
||||||
this.socketClient = socketClient;
|
this.socketClient = socketClient;
|
||||||
this.executor = executor;
|
this.executor = executor;
|
||||||
@@ -108,6 +110,7 @@ public class MdnsServiceTypeClient {
|
|||||||
this.responseDecoder = new MdnsResponseDecoder(clock, serviceTypeLabels);
|
this.responseDecoder = new MdnsResponseDecoder(clock, serviceTypeLabels);
|
||||||
this.clock = clock;
|
this.clock = clock;
|
||||||
this.network = network;
|
this.network = network;
|
||||||
|
this.sharedLog = sharedLog;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static MdnsServiceInfo buildMdnsServiceInfoFromResponse(
|
private static MdnsServiceInfo buildMdnsServiceInfoFromResponse(
|
||||||
@@ -261,20 +264,20 @@ public class MdnsServiceTypeClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void onResponseModified(@NonNull MdnsResponse response) {
|
private void onResponseModified(@NonNull MdnsResponse response) {
|
||||||
|
final String serviceInstanceName = response.getServiceInstanceName();
|
||||||
final MdnsResponse currentResponse =
|
final MdnsResponse currentResponse =
|
||||||
instanceNameToResponse.get(response.getServiceInstanceName());
|
instanceNameToResponse.get(serviceInstanceName);
|
||||||
|
|
||||||
boolean newServiceFound = false;
|
boolean newServiceFound = false;
|
||||||
boolean serviceBecomesComplete = false;
|
boolean serviceBecomesComplete = false;
|
||||||
if (currentResponse == null) {
|
if (currentResponse == null) {
|
||||||
newServiceFound = true;
|
newServiceFound = true;
|
||||||
String serviceInstanceName = response.getServiceInstanceName();
|
|
||||||
if (serviceInstanceName != null) {
|
if (serviceInstanceName != null) {
|
||||||
instanceNameToResponse.put(serviceInstanceName, response);
|
instanceNameToResponse.put(serviceInstanceName, response);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
boolean before = currentResponse.isComplete();
|
boolean before = currentResponse.isComplete();
|
||||||
instanceNameToResponse.put(response.getServiceInstanceName(), response);
|
instanceNameToResponse.put(serviceInstanceName, response);
|
||||||
boolean after = response.isComplete();
|
boolean after = response.isComplete();
|
||||||
serviceBecomesComplete = !before && after;
|
serviceBecomesComplete = !before && after;
|
||||||
}
|
}
|
||||||
@@ -285,13 +288,16 @@ public class MdnsServiceTypeClient {
|
|||||||
if (!responseMatchesOptions(response, listeners.valueAt(i))) continue;
|
if (!responseMatchesOptions(response, listeners.valueAt(i))) continue;
|
||||||
final MdnsServiceBrowserListener listener = listeners.keyAt(i);
|
final MdnsServiceBrowserListener listener = listeners.keyAt(i);
|
||||||
if (newServiceFound) {
|
if (newServiceFound) {
|
||||||
|
sharedLog.log("onServiceNameDiscovered: " + serviceInstanceName);
|
||||||
listener.onServiceNameDiscovered(serviceInfo);
|
listener.onServiceNameDiscovered(serviceInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (response.isComplete()) {
|
if (response.isComplete()) {
|
||||||
if (newServiceFound || serviceBecomesComplete) {
|
if (newServiceFound || serviceBecomesComplete) {
|
||||||
|
sharedLog.log("onServiceFound: " + serviceInstanceName);
|
||||||
listener.onServiceFound(serviceInfo);
|
listener.onServiceFound(serviceInfo);
|
||||||
} else {
|
} else {
|
||||||
|
sharedLog.log("onServiceUpdated: " + serviceInstanceName);
|
||||||
listener.onServiceUpdated(serviceInfo);
|
listener.onServiceUpdated(serviceInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -309,8 +315,10 @@ public class MdnsServiceTypeClient {
|
|||||||
final MdnsServiceInfo serviceInfo =
|
final MdnsServiceInfo serviceInfo =
|
||||||
buildMdnsServiceInfoFromResponse(response, serviceTypeLabels);
|
buildMdnsServiceInfoFromResponse(response, serviceTypeLabels);
|
||||||
if (response.isComplete()) {
|
if (response.isComplete()) {
|
||||||
|
sharedLog.log("onServiceRemoved: " + serviceInstanceName);
|
||||||
listener.onServiceRemoved(serviceInfo);
|
listener.onServiceRemoved(serviceInfo);
|
||||||
}
|
}
|
||||||
|
sharedLog.log("onServiceNameRemoved: " + serviceInstanceName);
|
||||||
listener.onServiceNameRemoved(serviceInfo);
|
listener.onServiceNameRemoved(serviceInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -485,7 +493,7 @@ public class MdnsServiceTypeClient {
|
|||||||
servicesToResolve)
|
servicesToResolve)
|
||||||
.call();
|
.call();
|
||||||
} catch (RuntimeException e) {
|
} catch (RuntimeException e) {
|
||||||
LOGGER.e(String.format("Failed to run EnqueueMdnsQueryCallable for subtype: %s",
|
sharedLog.e(String.format("Failed to run EnqueueMdnsQueryCallable for subtype: %s",
|
||||||
TextUtils.join(",", config.subtypes)), e);
|
TextUtils.join(",", config.subtypes)), e);
|
||||||
result = null;
|
result = null;
|
||||||
}
|
}
|
||||||
@@ -534,8 +542,12 @@ public class MdnsServiceTypeClient {
|
|||||||
buildMdnsServiceInfoFromResponse(
|
buildMdnsServiceInfoFromResponse(
|
||||||
existingResponse, serviceTypeLabels);
|
existingResponse, serviceTypeLabels);
|
||||||
if (existingResponse.isComplete()) {
|
if (existingResponse.isComplete()) {
|
||||||
|
sharedLog.log("TTL expired. onServiceRemoved: "
|
||||||
|
+ serviceInstanceName);
|
||||||
listener.onServiceRemoved(serviceInfo);
|
listener.onServiceRemoved(serviceInfo);
|
||||||
}
|
}
|
||||||
|
sharedLog.log("TTL expired. onServiceNameRemoved: "
|
||||||
|
+ serviceInstanceName);
|
||||||
listener.onServiceNameRemoved(serviceInfo);
|
listener.onServiceNameRemoved(serviceInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,9 +42,9 @@ import com.android.internal.annotations.VisibleForTesting;
|
|||||||
import com.android.net.module.util.CollectionUtils;
|
import com.android.net.module.util.CollectionUtils;
|
||||||
import com.android.net.module.util.LinkPropertiesUtils.CompareResult;
|
import com.android.net.module.util.LinkPropertiesUtils.CompareResult;
|
||||||
import com.android.net.module.util.SharedLog;
|
import com.android.net.module.util.SharedLog;
|
||||||
import com.android.server.connectivity.mdns.util.MdnsLogger;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.PrintWriter;
|
||||||
import java.net.NetworkInterface;
|
import java.net.NetworkInterface;
|
||||||
import java.net.SocketException;
|
import java.net.SocketException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -66,7 +66,7 @@ public class MdnsSocketProvider {
|
|||||||
// But 1440 should generally be enough because of standard Ethernet.
|
// But 1440 should generally be enough because of standard Ethernet.
|
||||||
// Note: mdnsresponder mDNSEmbeddedAPI.h uses 8940 for Ethernet jumbo frames.
|
// Note: mdnsresponder mDNSEmbeddedAPI.h uses 8940 for Ethernet jumbo frames.
|
||||||
private static final int READ_BUFFER_SIZE = 2048;
|
private static final int READ_BUFFER_SIZE = 2048;
|
||||||
private static final MdnsLogger LOGGER = new MdnsLogger(TAG);
|
private static final SharedLog LOGGER = new SharedLog(TAG);
|
||||||
private static final int IFACE_IDX_NOT_EXIST = -1;
|
private static final int IFACE_IDX_NOT_EXIST = -1;
|
||||||
@NonNull private final Context mContext;
|
@NonNull private final Context mContext;
|
||||||
@NonNull private final Looper mLooper;
|
@NonNull private final Looper mLooper;
|
||||||
@@ -132,7 +132,7 @@ public class MdnsSocketProvider {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
mSocketNetlinkMonitor = mDependencies.createSocketNetlinkMonitor(mHandler, LOGGER.mLog,
|
mSocketNetlinkMonitor = mDependencies.createSocketNetlinkMonitor(mHandler, LOGGER,
|
||||||
new NetLinkMessageProcessor());
|
new NetLinkMessageProcessor());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -258,7 +258,7 @@ public class MdnsSocketProvider {
|
|||||||
Log.d(TAG, "Already monitoring sockets.");
|
Log.d(TAG, "Already monitoring sockets.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (DBG) Log.d(TAG, "Start monitoring sockets.");
|
LOGGER.i("Start monitoring sockets.");
|
||||||
mContext.getSystemService(ConnectivityManager.class).registerNetworkCallback(
|
mContext.getSystemService(ConnectivityManager.class).registerNetworkCallback(
|
||||||
new NetworkRequest.Builder().clearCapabilities().build(),
|
new NetworkRequest.Builder().clearCapabilities().build(),
|
||||||
mNetworkCallback, mHandler);
|
mNetworkCallback, mHandler);
|
||||||
@@ -287,6 +287,7 @@ public class MdnsSocketProvider {
|
|||||||
|
|
||||||
// Only unregister the network callback if there is no socket request.
|
// Only unregister the network callback if there is no socket request.
|
||||||
if (mCallbacksToRequestedNetworks.isEmpty()) {
|
if (mCallbacksToRequestedNetworks.isEmpty()) {
|
||||||
|
LOGGER.i("Stop monitoring sockets.");
|
||||||
mContext.getSystemService(ConnectivityManager.class)
|
mContext.getSystemService(ConnectivityManager.class)
|
||||||
.unregisterNetworkCallback(mNetworkCallback);
|
.unregisterNetworkCallback(mNetworkCallback);
|
||||||
|
|
||||||
@@ -312,7 +313,6 @@ public class MdnsSocketProvider {
|
|||||||
Log.d(TAG, "Monitoring sockets hasn't been started.");
|
Log.d(TAG, "Monitoring sockets hasn't been started.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (DBG) Log.d(TAG, "Try to stop monitoring sockets.");
|
|
||||||
mRequestStop = true;
|
mRequestStop = true;
|
||||||
maybeStopMonitoringSockets();
|
maybeStopMonitoringSockets();
|
||||||
}
|
}
|
||||||
@@ -431,10 +431,7 @@ public class MdnsSocketProvider {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (DBG) {
|
LOGGER.log("Create socket on net:" + networkKey + ", ifName:" + interfaceName);
|
||||||
Log.d(TAG, "Create a socket on network:" + networkKey
|
|
||||||
+ " with interfaceName:" + interfaceName);
|
|
||||||
}
|
|
||||||
final MdnsInterfaceSocket socket = mDependencies.createMdnsInterfaceSocket(
|
final MdnsInterfaceSocket socket = mDependencies.createMdnsInterfaceSocket(
|
||||||
networkInterface.getNetworkInterface(), MdnsConstants.MDNS_PORT, mLooper,
|
networkInterface.getNetworkInterface(), MdnsConstants.MDNS_PORT, mLooper,
|
||||||
mPacketReadBuffer);
|
mPacketReadBuffer);
|
||||||
@@ -455,7 +452,7 @@ public class MdnsSocketProvider {
|
|||||||
notifySocketCreated(((NetworkAsKey) networkKey).mNetwork, socket, addresses);
|
notifySocketCreated(((NetworkAsKey) networkKey).mNetwork, socket, addresses);
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Log.e(TAG, "Create a socket failed with interface=" + interfaceName, e);
|
LOGGER.e("Create socket failed ifName:" + interfaceName, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -484,7 +481,7 @@ public class MdnsSocketProvider {
|
|||||||
// transports above in priority.
|
// transports above in priority.
|
||||||
return iface.supportsMulticast();
|
return iface.supportsMulticast();
|
||||||
} catch (SocketException e) {
|
} catch (SocketException e) {
|
||||||
Log.e(TAG, "Error checking interface flags", e);
|
LOGGER.e("Error checking interface flags", e);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -495,6 +492,7 @@ public class MdnsSocketProvider {
|
|||||||
|
|
||||||
socketInfo.mSocket.destroy();
|
socketInfo.mSocket.destroy();
|
||||||
notifyInterfaceDestroyed(network, socketInfo.mSocket);
|
notifyInterfaceDestroyed(network, socketInfo.mSocket);
|
||||||
|
LOGGER.log("Remove socket on net:" + network);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void removeTetherInterfaceSocket(String interfaceName) {
|
private void removeTetherInterfaceSocket(String interfaceName) {
|
||||||
@@ -502,6 +500,7 @@ public class MdnsSocketProvider {
|
|||||||
if (socketInfo == null) return;
|
if (socketInfo == null) return;
|
||||||
socketInfo.mSocket.destroy();
|
socketInfo.mSocket.destroy();
|
||||||
notifyInterfaceDestroyed(null /* network */, socketInfo.mSocket);
|
notifyInterfaceDestroyed(null /* network */, socketInfo.mSocket);
|
||||||
|
LOGGER.log("Remove socket on ifName:" + interfaceName);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void notifySocketCreated(Network network, MdnsInterfaceSocket socket,
|
private void notifySocketCreated(Network network, MdnsInterfaceSocket socket,
|
||||||
@@ -610,6 +609,7 @@ public class MdnsSocketProvider {
|
|||||||
info.mSocket.destroy();
|
info.mSocket.destroy();
|
||||||
// Still notify to unrequester for socket destroy.
|
// Still notify to unrequester for socket destroy.
|
||||||
cb.onInterfaceDestroyed(network, info.mSocket);
|
cb.onInterfaceDestroyed(network, info.mSocket);
|
||||||
|
LOGGER.log("Remove socket on net:" + network + " after unrequestSocket");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove all sockets for tethering interface because these sockets do not have associated
|
// Remove all sockets for tethering interface because these sockets do not have associated
|
||||||
@@ -620,6 +620,8 @@ public class MdnsSocketProvider {
|
|||||||
info.mSocket.destroy();
|
info.mSocket.destroy();
|
||||||
// Still notify to unrequester for socket destroy.
|
// Still notify to unrequester for socket destroy.
|
||||||
cb.onInterfaceDestroyed(null /* network */, info.mSocket);
|
cb.onInterfaceDestroyed(null /* network */, info.mSocket);
|
||||||
|
LOGGER.log("Remove socket on ifName:" + mTetherInterfaceSockets.keyAt(i)
|
||||||
|
+ " after unrequestSocket");
|
||||||
}
|
}
|
||||||
mTetherInterfaceSockets.clear();
|
mTetherInterfaceSockets.clear();
|
||||||
|
|
||||||
@@ -627,6 +629,11 @@ public class MdnsSocketProvider {
|
|||||||
maybeStopMonitoringSockets();
|
maybeStopMonitoringSockets();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Dump info to dumpsys */
|
||||||
|
public void dump(PrintWriter pw) {
|
||||||
|
LOGGER.reverseDump(pw);
|
||||||
|
}
|
||||||
|
|
||||||
/*** Callbacks for listening socket changes */
|
/*** Callbacks for listening socket changes */
|
||||||
public interface SocketCallback {
|
public interface SocketCallback {
|
||||||
/*** Notify the socket is created */
|
/*** Notify the socket is created */
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import android.net.nsd.NsdServiceInfo
|
|||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.HandlerThread
|
import android.os.HandlerThread
|
||||||
import com.android.net.module.util.HexDump
|
import com.android.net.module.util.HexDump
|
||||||
|
import com.android.net.module.util.SharedLog
|
||||||
import com.android.server.connectivity.mdns.MdnsAnnouncer.AnnouncementInfo
|
import com.android.server.connectivity.mdns.MdnsAnnouncer.AnnouncementInfo
|
||||||
import com.android.server.connectivity.mdns.MdnsAnnouncer.BaseAnnouncementInfo
|
import com.android.server.connectivity.mdns.MdnsAnnouncer.BaseAnnouncementInfo
|
||||||
import com.android.server.connectivity.mdns.MdnsAnnouncer.ExitAnnouncementInfo
|
import com.android.server.connectivity.mdns.MdnsAnnouncer.ExitAnnouncementInfo
|
||||||
@@ -75,6 +76,7 @@ class MdnsInterfaceAdvertiserTest {
|
|||||||
private val replySender = mock(MdnsReplySender::class.java)
|
private val replySender = mock(MdnsReplySender::class.java)
|
||||||
private val announcer = mock(MdnsAnnouncer::class.java)
|
private val announcer = mock(MdnsAnnouncer::class.java)
|
||||||
private val prober = mock(MdnsProber::class.java)
|
private val prober = mock(MdnsProber::class.java)
|
||||||
|
private val sharedlog = mock(SharedLog::class.java)
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
private val probeCbCaptor = ArgumentCaptor.forClass(PacketRepeaterCallback::class.java)
|
private val probeCbCaptor = ArgumentCaptor.forClass(PacketRepeaterCallback::class.java)
|
||||||
as ArgumentCaptor<PacketRepeaterCallback<ProbingInfo>>
|
as ArgumentCaptor<PacketRepeaterCallback<ProbingInfo>>
|
||||||
@@ -97,7 +99,8 @@ class MdnsInterfaceAdvertiserTest {
|
|||||||
TEST_BUFFER,
|
TEST_BUFFER,
|
||||||
cb,
|
cb,
|
||||||
deps,
|
deps,
|
||||||
TEST_HOSTNAME
|
TEST_HOSTNAME,
|
||||||
|
sharedlog
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ import android.net.InetAddresses;
|
|||||||
import android.net.Network;
|
import android.net.Network;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
|
||||||
|
import com.android.net.module.util.SharedLog;
|
||||||
import com.android.server.connectivity.mdns.MdnsServiceInfo.TextEntry;
|
import com.android.server.connectivity.mdns.MdnsServiceInfo.TextEntry;
|
||||||
import com.android.server.connectivity.mdns.MdnsServiceTypeClient.QueryTaskConfig;
|
import com.android.server.connectivity.mdns.MdnsServiceTypeClient.QueryTaskConfig;
|
||||||
import com.android.testutils.DevSdkIgnoreRule;
|
import com.android.testutils.DevSdkIgnoreRule;
|
||||||
@@ -99,6 +100,8 @@ public class MdnsServiceTypeClientTests {
|
|||||||
private Network mockNetwork;
|
private Network mockNetwork;
|
||||||
@Mock
|
@Mock
|
||||||
private MdnsResponseDecoder.Clock mockDecoderClock;
|
private MdnsResponseDecoder.Clock mockDecoderClock;
|
||||||
|
@Mock
|
||||||
|
private SharedLog mockSharedLog;
|
||||||
@Captor
|
@Captor
|
||||||
private ArgumentCaptor<MdnsServiceInfo> serviceInfoCaptor;
|
private ArgumentCaptor<MdnsServiceInfo> serviceInfoCaptor;
|
||||||
|
|
||||||
@@ -166,7 +169,7 @@ public class MdnsServiceTypeClientTests {
|
|||||||
|
|
||||||
client =
|
client =
|
||||||
new MdnsServiceTypeClient(SERVICE_TYPE, mockSocketClient, currentThreadExecutor,
|
new MdnsServiceTypeClient(SERVICE_TYPE, mockSocketClient, currentThreadExecutor,
|
||||||
mockDecoderClock, mockNetwork) {
|
mockDecoderClock, mockNetwork, mockSharedLog) {
|
||||||
@Override
|
@Override
|
||||||
MdnsPacketWriter createMdnsPacketWriter() {
|
MdnsPacketWriter createMdnsPacketWriter() {
|
||||||
return mockPacketWriter;
|
return mockPacketWriter;
|
||||||
@@ -701,7 +704,7 @@ public class MdnsServiceTypeClientTests {
|
|||||||
final String serviceInstanceName = "service-instance-1";
|
final String serviceInstanceName = "service-instance-1";
|
||||||
client =
|
client =
|
||||||
new MdnsServiceTypeClient(SERVICE_TYPE, mockSocketClient, currentThreadExecutor,
|
new MdnsServiceTypeClient(SERVICE_TYPE, mockSocketClient, currentThreadExecutor,
|
||||||
mockDecoderClock, mockNetwork) {
|
mockDecoderClock, mockNetwork, mockSharedLog) {
|
||||||
@Override
|
@Override
|
||||||
MdnsPacketWriter createMdnsPacketWriter() {
|
MdnsPacketWriter createMdnsPacketWriter() {
|
||||||
return mockPacketWriter;
|
return mockPacketWriter;
|
||||||
@@ -740,7 +743,7 @@ public class MdnsServiceTypeClientTests {
|
|||||||
final String serviceInstanceName = "service-instance-1";
|
final String serviceInstanceName = "service-instance-1";
|
||||||
client =
|
client =
|
||||||
new MdnsServiceTypeClient(SERVICE_TYPE, mockSocketClient, currentThreadExecutor,
|
new MdnsServiceTypeClient(SERVICE_TYPE, mockSocketClient, currentThreadExecutor,
|
||||||
mockDecoderClock, mockNetwork) {
|
mockDecoderClock, mockNetwork, mockSharedLog) {
|
||||||
@Override
|
@Override
|
||||||
MdnsPacketWriter createMdnsPacketWriter() {
|
MdnsPacketWriter createMdnsPacketWriter() {
|
||||||
return mockPacketWriter;
|
return mockPacketWriter;
|
||||||
@@ -773,7 +776,7 @@ public class MdnsServiceTypeClientTests {
|
|||||||
final String serviceInstanceName = "service-instance-1";
|
final String serviceInstanceName = "service-instance-1";
|
||||||
client =
|
client =
|
||||||
new MdnsServiceTypeClient(SERVICE_TYPE, mockSocketClient, currentThreadExecutor,
|
new MdnsServiceTypeClient(SERVICE_TYPE, mockSocketClient, currentThreadExecutor,
|
||||||
mockDecoderClock, mockNetwork) {
|
mockDecoderClock, mockNetwork, mockSharedLog) {
|
||||||
@Override
|
@Override
|
||||||
MdnsPacketWriter createMdnsPacketWriter() {
|
MdnsPacketWriter createMdnsPacketWriter() {
|
||||||
return mockPacketWriter;
|
return mockPacketWriter;
|
||||||
@@ -898,7 +901,7 @@ public class MdnsServiceTypeClientTests {
|
|||||||
@Test
|
@Test
|
||||||
public void testProcessResponse_Resolve() throws Exception {
|
public void testProcessResponse_Resolve() throws Exception {
|
||||||
client = new MdnsServiceTypeClient(
|
client = new MdnsServiceTypeClient(
|
||||||
SERVICE_TYPE, mockSocketClient, currentThreadExecutor, mockNetwork);
|
SERVICE_TYPE, mockSocketClient, currentThreadExecutor, mockNetwork, mockSharedLog);
|
||||||
|
|
||||||
final String instanceName = "service-instance";
|
final String instanceName = "service-instance";
|
||||||
final String[] hostname = new String[] { "testhost "};
|
final String[] hostname = new String[] { "testhost "};
|
||||||
|
|||||||
Reference in New Issue
Block a user