Merge "Use a single SharedLog for all mdns components" into udc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
1234a80935
@@ -142,6 +142,7 @@ public class NsdService extends INsdManager.Stub {
|
||||
public static final boolean DBG = Log.isLoggable(TAG, Log.DEBUG);
|
||||
private static final long CLEANUP_DELAY_MS = 10000;
|
||||
private static final int IFACE_IDX_ANY = 0;
|
||||
private static final SharedLog LOGGER = new SharedLog("serviceDiscovery");
|
||||
|
||||
private final Context mContext;
|
||||
private final NsdStateMachine mNsdStateMachine;
|
||||
@@ -157,7 +158,7 @@ public class NsdService extends INsdManager.Stub {
|
||||
private final MdnsSocketProvider mMdnsSocketProvider;
|
||||
@NonNull
|
||||
private final MdnsAdvertiser mAdvertiser;
|
||||
private final SharedLog mServiceLogs = new SharedLog(TAG);
|
||||
private final SharedLog mServiceLogs = LOGGER.forSubComponent(TAG);
|
||||
// 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
|
||||
// synchronization.
|
||||
@@ -1326,17 +1327,18 @@ public class NsdService extends INsdManager.Stub {
|
||||
mMDnsEventCallback = new MDnsEventCallback(mNsdStateMachine);
|
||||
mDeps = deps;
|
||||
|
||||
mMdnsSocketProvider = deps.makeMdnsSocketProvider(ctx, handler.getLooper());
|
||||
mMdnsSocketProvider = deps.makeMdnsSocketProvider(ctx, handler.getLooper(),
|
||||
LOGGER.forSubComponent("MdnsSocketProvider"));
|
||||
// Netlink monitor starts on boot, and intentionally never stopped, to ensure that all
|
||||
// address events are received.
|
||||
handler.post(mMdnsSocketProvider::startNetLinkMonitor);
|
||||
mMdnsSocketClient =
|
||||
new MdnsMultinetworkSocketClient(handler.getLooper(), mMdnsSocketProvider);
|
||||
mMdnsDiscoveryManager =
|
||||
deps.makeMdnsDiscoveryManager(new ExecutorProvider(), mMdnsSocketClient);
|
||||
mMdnsDiscoveryManager = deps.makeMdnsDiscoveryManager(new ExecutorProvider(),
|
||||
mMdnsSocketClient, LOGGER.forSubComponent("MdnsDiscoveryManager"));
|
||||
handler.post(() -> mMdnsSocketClient.setCallback(mMdnsDiscoveryManager));
|
||||
mAdvertiser = deps.makeMdnsAdvertiser(handler.getLooper(), mMdnsSocketProvider,
|
||||
new AdvertiserCallback());
|
||||
new AdvertiserCallback(), LOGGER.forSubComponent("MdnsAdvertiser"));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1390,8 +1392,9 @@ public class NsdService extends INsdManager.Stub {
|
||||
* @see MdnsDiscoveryManager
|
||||
*/
|
||||
public MdnsDiscoveryManager makeMdnsDiscoveryManager(
|
||||
ExecutorProvider executorProvider, MdnsSocketClientBase socketClient) {
|
||||
return new MdnsDiscoveryManager(executorProvider, socketClient);
|
||||
@NonNull ExecutorProvider executorProvider,
|
||||
@NonNull MdnsSocketClientBase socketClient, @NonNull SharedLog sharedLog) {
|
||||
return new MdnsDiscoveryManager(executorProvider, socketClient, sharedLog);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1399,15 +1402,16 @@ public class NsdService extends INsdManager.Stub {
|
||||
*/
|
||||
public MdnsAdvertiser makeMdnsAdvertiser(
|
||||
@NonNull Looper looper, @NonNull MdnsSocketProvider socketProvider,
|
||||
@NonNull MdnsAdvertiser.AdvertiserCallback cb) {
|
||||
return new MdnsAdvertiser(looper, socketProvider, cb);
|
||||
@NonNull MdnsAdvertiser.AdvertiserCallback cb, @NonNull SharedLog sharedLog) {
|
||||
return new MdnsAdvertiser(looper, socketProvider, cb, sharedLog);
|
||||
}
|
||||
|
||||
/**
|
||||
* @see MdnsSocketProvider
|
||||
*/
|
||||
public MdnsSocketProvider makeMdnsSocketProvider(Context context, Looper looper) {
|
||||
return new MdnsSocketProvider(context, looper);
|
||||
public MdnsSocketProvider makeMdnsSocketProvider(@NonNull Context context,
|
||||
@NonNull Looper looper, @NonNull SharedLog sharedLog) {
|
||||
return new MdnsSocketProvider(context, looper, sharedLog);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1769,30 +1773,10 @@ public class NsdService extends INsdManager.Stub {
|
||||
|
||||
// Dump service and clients logs
|
||||
pw.println();
|
||||
pw.println("Logs:");
|
||||
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 {
|
||||
|
||||
@@ -33,7 +33,6 @@ import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.net.module.util.SharedLog;
|
||||
import com.android.server.connectivity.mdns.util.MdnsUtils;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
@@ -51,7 +50,7 @@ public class MdnsAdvertiser {
|
||||
|
||||
// Top-level domain for link-local queries, as per RFC6762 3.
|
||||
private static final String LOCAL_TLD = "local";
|
||||
private static final SharedLog LOGGER = new SharedLog(TAG);
|
||||
|
||||
|
||||
private final Looper mLooper;
|
||||
private final AdvertiserCallback mCb;
|
||||
@@ -71,6 +70,7 @@ public class MdnsAdvertiser {
|
||||
private final Dependencies mDeps;
|
||||
|
||||
private String[] mDeviceHostName;
|
||||
@NonNull private final SharedLog mSharedLog;
|
||||
|
||||
/**
|
||||
* Dependencies for {@link MdnsAdvertiser}, useful for testing.
|
||||
@@ -84,11 +84,11 @@ public class MdnsAdvertiser {
|
||||
@NonNull List<LinkAddress> initialAddresses,
|
||||
@NonNull Looper looper, @NonNull byte[] packetCreationBuffer,
|
||||
@NonNull MdnsInterfaceAdvertiser.Callback cb,
|
||||
@NonNull String[] deviceHostName) {
|
||||
@NonNull String[] deviceHostName,
|
||||
@NonNull SharedLog sharedLog) {
|
||||
// Note NetworkInterface is final and not mockable
|
||||
final String logTag = socket.getInterface().getName();
|
||||
return new MdnsInterfaceAdvertiser(logTag, socket, initialAddresses, looper,
|
||||
packetCreationBuffer, cb, deviceHostName, LOGGER.forSubComponent(logTag));
|
||||
return new MdnsInterfaceAdvertiser(socket, initialAddresses, looper,
|
||||
packetCreationBuffer, cb, deviceHostName, sharedLog);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -135,7 +135,7 @@ public class MdnsAdvertiser {
|
||||
|
||||
@Override
|
||||
public void onServiceConflict(@NonNull MdnsInterfaceAdvertiser advertiser, int serviceId) {
|
||||
LOGGER.i("Found conflict, restarted probing for service " + serviceId);
|
||||
mSharedLog.i("Found conflict, restarted probing for service " + serviceId);
|
||||
|
||||
final Registration registration = mRegistrations.get(serviceId);
|
||||
if (registration == null) return;
|
||||
@@ -291,7 +291,8 @@ public class MdnsAdvertiser {
|
||||
MdnsInterfaceAdvertiser advertiser = mAllAdvertisers.get(socket);
|
||||
if (advertiser == null) {
|
||||
advertiser = mDeps.makeAdvertiser(socket, addresses, mLooper, mPacketCreationBuffer,
|
||||
mInterfaceAdvertiserCb, mDeviceHostName);
|
||||
mInterfaceAdvertiserCb, mDeviceHostName,
|
||||
mSharedLog.forSubComponent(socket.getInterface().getName()));
|
||||
mAllAdvertisers.put(socket, advertiser);
|
||||
advertiser.start();
|
||||
}
|
||||
@@ -416,18 +417,20 @@ public class MdnsAdvertiser {
|
||||
}
|
||||
|
||||
public MdnsAdvertiser(@NonNull Looper looper, @NonNull MdnsSocketProvider socketProvider,
|
||||
@NonNull AdvertiserCallback cb) {
|
||||
this(looper, socketProvider, cb, new Dependencies());
|
||||
@NonNull AdvertiserCallback cb, @NonNull SharedLog sharedLog) {
|
||||
this(looper, socketProvider, cb, new Dependencies(), sharedLog);
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
MdnsAdvertiser(@NonNull Looper looper, @NonNull MdnsSocketProvider socketProvider,
|
||||
@NonNull AdvertiserCallback cb, @NonNull Dependencies deps) {
|
||||
@NonNull AdvertiserCallback cb, @NonNull Dependencies deps,
|
||||
@NonNull SharedLog sharedLog) {
|
||||
mLooper = looper;
|
||||
mCb = cb;
|
||||
mSocketProvider = socketProvider;
|
||||
mDeps = deps;
|
||||
mDeviceHostName = deps.generateHostname();
|
||||
mSharedLog = sharedLog;
|
||||
}
|
||||
|
||||
private void checkThread() {
|
||||
@@ -450,7 +453,7 @@ public class MdnsAdvertiser {
|
||||
return;
|
||||
}
|
||||
|
||||
LOGGER.i("Adding service " + service + " with ID " + id);
|
||||
mSharedLog.i("Adding service " + service + " with ID " + id);
|
||||
|
||||
final Network network = service.getNetwork();
|
||||
final Registration registration = new Registration(service);
|
||||
@@ -482,7 +485,7 @@ public class MdnsAdvertiser {
|
||||
public void removeService(int id) {
|
||||
checkThread();
|
||||
if (!mRegistrations.contains(id)) return;
|
||||
LOGGER.i("Removing service with ID " + id);
|
||||
mSharedLog.i("Removing service with ID " + id);
|
||||
for (int i = mAdvertiserRequests.size() - 1; i >= 0; i--) {
|
||||
final InterfaceAdvertiserRequest advertiser = mAdvertiserRequests.valueAt(i);
|
||||
advertiser.removeService(id);
|
||||
@@ -494,10 +497,6 @@ 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,
|
||||
@NonNull BiPredicate<K, V> predicate) {
|
||||
for (int i = 0; i < map.size(); i++) {
|
||||
|
||||
@@ -32,7 +32,6 @@ import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.net.module.util.SharedLog;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@@ -43,10 +42,10 @@ import java.util.List;
|
||||
public class MdnsDiscoveryManager implements MdnsSocketClientBase.Callback {
|
||||
private static final String TAG = MdnsDiscoveryManager.class.getSimpleName();
|
||||
public static final boolean DBG = Log.isLoggable(TAG, Log.DEBUG);
|
||||
private static final SharedLog LOGGER = new SharedLog(TAG);
|
||||
|
||||
private final ExecutorProvider executorProvider;
|
||||
private final MdnsSocketClientBase socketClient;
|
||||
@NonNull private final SharedLog sharedLog;
|
||||
|
||||
@GuardedBy("this")
|
||||
@NonNull private final PerNetworkServiceTypeClients perNetworkServiceTypeClients;
|
||||
@@ -104,9 +103,10 @@ public class MdnsDiscoveryManager implements MdnsSocketClientBase.Callback {
|
||||
}
|
||||
|
||||
public MdnsDiscoveryManager(@NonNull ExecutorProvider executorProvider,
|
||||
@NonNull MdnsSocketClientBase socketClient) {
|
||||
@NonNull MdnsSocketClientBase socketClient, @NonNull SharedLog sharedLog) {
|
||||
this.executorProvider = executorProvider;
|
||||
this.socketClient = socketClient;
|
||||
this.sharedLog = sharedLog;
|
||||
perNetworkServiceTypeClients = new PerNetworkServiceTypeClients();
|
||||
}
|
||||
|
||||
@@ -124,13 +124,13 @@ public class MdnsDiscoveryManager implements MdnsSocketClientBase.Callback {
|
||||
@NonNull String serviceType,
|
||||
@NonNull MdnsServiceBrowserListener listener,
|
||||
@NonNull MdnsSearchOptions searchOptions) {
|
||||
LOGGER.i("Registering listener for serviceType: " + serviceType);
|
||||
sharedLog.i("Registering listener for serviceType: " + serviceType);
|
||||
if (perNetworkServiceTypeClients.isEmpty()) {
|
||||
// First listener. Starts the socket client.
|
||||
try {
|
||||
socketClient.startDiscovery();
|
||||
} catch (IOException e) {
|
||||
LOGGER.e("Failed to start discover.", e);
|
||||
sharedLog.e("Failed to start discover.", e);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -159,7 +159,7 @@ public class MdnsDiscoveryManager implements MdnsSocketClientBase.Callback {
|
||||
@RequiresPermission(permission.CHANGE_WIFI_MULTICAST_STATE)
|
||||
public synchronized void unregisterListener(
|
||||
@NonNull String serviceType, @NonNull MdnsServiceBrowserListener listener) {
|
||||
LOGGER.i("Unregistering listener for serviceType:" + serviceType);
|
||||
sharedLog.i("Unregistering listener for serviceType:" + serviceType);
|
||||
final List<MdnsServiceTypeClient> serviceTypeClients =
|
||||
perNetworkServiceTypeClients.getByServiceType(serviceType);
|
||||
if (serviceTypeClients.isEmpty()) {
|
||||
@@ -199,19 +199,13 @@ public class MdnsDiscoveryManager implements MdnsSocketClientBase.Callback {
|
||||
}
|
||||
}
|
||||
|
||||
/** Dump info to dumpsys */
|
||||
public void dump(PrintWriter pw) {
|
||||
LOGGER.reverseDump(pw);
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
MdnsServiceTypeClient createServiceTypeClient(@NonNull String serviceType,
|
||||
@Nullable Network network) {
|
||||
LOGGER.log("createServiceTypeClient for serviceType:" + serviceType
|
||||
+ " network:" + network);
|
||||
sharedLog.log("createServiceTypeClient for type:" + serviceType + ", net:" + network);
|
||||
return new MdnsServiceTypeClient(
|
||||
serviceType, socketClient,
|
||||
executorProvider.newServiceTypeClientSchedulerExecutor(), network,
|
||||
LOGGER.forSubComponent(serviceType + "-" + network));
|
||||
sharedLog.forSubComponent(serviceType + "-" + network));
|
||||
}
|
||||
}
|
||||
@@ -170,29 +170,29 @@ public class MdnsInterfaceAdvertiser implements MulticastPacketReader.PacketHand
|
||||
}
|
||||
}
|
||||
|
||||
public MdnsInterfaceAdvertiser(@NonNull String logTag,
|
||||
@NonNull MdnsInterfaceSocket socket, @NonNull List<LinkAddress> initialAddresses,
|
||||
@NonNull Looper looper, @NonNull byte[] packetCreationBuffer, @NonNull Callback cb,
|
||||
public MdnsInterfaceAdvertiser(@NonNull MdnsInterfaceSocket socket,
|
||||
@NonNull List<LinkAddress> initialAddresses, @NonNull Looper looper,
|
||||
@NonNull byte[] packetCreationBuffer, @NonNull Callback cb,
|
||||
@NonNull String[] deviceHostName, @NonNull SharedLog sharedLog) {
|
||||
this(logTag, socket, initialAddresses, looper, packetCreationBuffer, cb,
|
||||
this(socket, initialAddresses, looper, packetCreationBuffer, cb,
|
||||
new Dependencies(), deviceHostName, sharedLog);
|
||||
}
|
||||
|
||||
public MdnsInterfaceAdvertiser(@NonNull String logTag,
|
||||
@NonNull MdnsInterfaceSocket socket, @NonNull List<LinkAddress> initialAddresses,
|
||||
@NonNull Looper looper, @NonNull byte[] packetCreationBuffer, @NonNull Callback cb,
|
||||
@NonNull Dependencies deps, @NonNull String[] deviceHostName,
|
||||
@NonNull SharedLog sharedLog) {
|
||||
mTag = MdnsInterfaceAdvertiser.class.getSimpleName() + "/" + logTag;
|
||||
public MdnsInterfaceAdvertiser(@NonNull MdnsInterfaceSocket socket,
|
||||
@NonNull List<LinkAddress> initialAddresses, @NonNull Looper looper,
|
||||
@NonNull byte[] packetCreationBuffer, @NonNull Callback cb, @NonNull Dependencies deps,
|
||||
@NonNull String[] deviceHostName, @NonNull SharedLog sharedLog) {
|
||||
mTag = MdnsInterfaceAdvertiser.class.getSimpleName() + "/" + sharedLog.getTag();
|
||||
mRecordRepository = deps.makeRecordRepository(looper, deviceHostName);
|
||||
mRecordRepository.updateAddresses(initialAddresses);
|
||||
mSocket = socket;
|
||||
mCb = cb;
|
||||
mCbHandler = new Handler(looper);
|
||||
mReplySender = deps.makeReplySender(logTag, looper, socket, packetCreationBuffer);
|
||||
mAnnouncer = deps.makeMdnsAnnouncer(logTag, looper, mReplySender,
|
||||
mReplySender = deps.makeReplySender(sharedLog.getTag(), looper, socket,
|
||||
packetCreationBuffer);
|
||||
mAnnouncer = deps.makeMdnsAnnouncer(sharedLog.getTag(), looper, mReplySender,
|
||||
mAnnouncingCallback);
|
||||
mProber = deps.makeMdnsProber(logTag, looper, mReplySender, mProbingCallback);
|
||||
mProber = deps.makeMdnsProber(sharedLog.getTag(), looper, mReplySender, mProbingCallback);
|
||||
mSharedLog = sharedLog;
|
||||
}
|
||||
|
||||
|
||||
@@ -288,16 +288,16 @@ public class MdnsServiceTypeClient {
|
||||
if (!responseMatchesOptions(response, listeners.valueAt(i))) continue;
|
||||
final MdnsServiceBrowserListener listener = listeners.keyAt(i);
|
||||
if (newServiceFound) {
|
||||
sharedLog.log("onServiceNameDiscovered: " + serviceInstanceName);
|
||||
sharedLog.log("onServiceNameDiscovered: " + serviceInfo);
|
||||
listener.onServiceNameDiscovered(serviceInfo);
|
||||
}
|
||||
|
||||
if (response.isComplete()) {
|
||||
if (newServiceFound || serviceBecomesComplete) {
|
||||
sharedLog.log("onServiceFound: " + serviceInstanceName);
|
||||
sharedLog.log("onServiceFound: " + serviceInfo);
|
||||
listener.onServiceFound(serviceInfo);
|
||||
} else {
|
||||
sharedLog.log("onServiceUpdated: " + serviceInstanceName);
|
||||
sharedLog.log("onServiceUpdated: " + serviceInfo);
|
||||
listener.onServiceUpdated(serviceInfo);
|
||||
}
|
||||
}
|
||||
@@ -315,10 +315,10 @@ public class MdnsServiceTypeClient {
|
||||
final MdnsServiceInfo serviceInfo =
|
||||
buildMdnsServiceInfoFromResponse(response, serviceTypeLabels);
|
||||
if (response.isComplete()) {
|
||||
sharedLog.log("onServiceRemoved: " + serviceInstanceName);
|
||||
sharedLog.log("onServiceRemoved: " + serviceInfo);
|
||||
listener.onServiceRemoved(serviceInfo);
|
||||
}
|
||||
sharedLog.log("onServiceNameRemoved: " + serviceInstanceName);
|
||||
sharedLog.log("onServiceNameRemoved: " + serviceInfo);
|
||||
listener.onServiceNameRemoved(serviceInfo);
|
||||
}
|
||||
}
|
||||
@@ -535,19 +535,17 @@ public class MdnsServiceTypeClient {
|
||||
continue;
|
||||
}
|
||||
final MdnsServiceBrowserListener listener = listeners.keyAt(i);
|
||||
String serviceInstanceName =
|
||||
existingResponse.getServiceInstanceName();
|
||||
if (serviceInstanceName != null) {
|
||||
if (existingResponse.getServiceInstanceName() != null) {
|
||||
final MdnsServiceInfo serviceInfo =
|
||||
buildMdnsServiceInfoFromResponse(
|
||||
existingResponse, serviceTypeLabels);
|
||||
if (existingResponse.isComplete()) {
|
||||
sharedLog.log("TTL expired. onServiceRemoved: "
|
||||
+ serviceInstanceName);
|
||||
+ serviceInfo);
|
||||
listener.onServiceRemoved(serviceInfo);
|
||||
}
|
||||
sharedLog.log("TTL expired. onServiceNameRemoved: "
|
||||
+ serviceInstanceName);
|
||||
+ serviceInfo);
|
||||
listener.onServiceNameRemoved(serviceInfo);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,7 +47,6 @@ import com.android.net.module.util.LinkPropertiesUtils.CompareResult;
|
||||
import com.android.net.module.util.SharedLog;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.net.NetworkInterface;
|
||||
import java.net.SocketException;
|
||||
import java.util.ArrayList;
|
||||
@@ -69,7 +68,6 @@ public class MdnsSocketProvider {
|
||||
// But 1440 should generally be enough because of standard Ethernet.
|
||||
// Note: mdnsresponder mDNSEmbeddedAPI.h uses 8940 for Ethernet jumbo frames.
|
||||
private static final int READ_BUFFER_SIZE = 2048;
|
||||
private static final SharedLog LOGGER = new SharedLog(TAG);
|
||||
private static final int IFACE_IDX_NOT_EXIST = -1;
|
||||
@NonNull private final Context mContext;
|
||||
@NonNull private final Looper mLooper;
|
||||
@@ -78,6 +76,7 @@ public class MdnsSocketProvider {
|
||||
@NonNull private final NetworkCallback mNetworkCallback;
|
||||
@NonNull private final TetheringEventCallback mTetheringEventCallback;
|
||||
@NonNull private final AbstractSocketNetlink mSocketNetlinkMonitor;
|
||||
@NonNull private final SharedLog mSharedLog;
|
||||
private final ArrayMap<Network, SocketInfo> mNetworkSockets = new ArrayMap<>();
|
||||
private final ArrayMap<String, SocketInfo> mTetherInterfaceSockets = new ArrayMap<>();
|
||||
private final ArrayMap<Network, LinkProperties> mActiveNetworksLinkProperties =
|
||||
@@ -94,16 +93,18 @@ public class MdnsSocketProvider {
|
||||
private boolean mMonitoringSockets = false;
|
||||
private boolean mRequestStop = false;
|
||||
|
||||
public MdnsSocketProvider(@NonNull Context context, @NonNull Looper looper) {
|
||||
this(context, looper, new Dependencies());
|
||||
public MdnsSocketProvider(@NonNull Context context, @NonNull Looper looper,
|
||||
@NonNull SharedLog sharedLog) {
|
||||
this(context, looper, new Dependencies(), sharedLog);
|
||||
}
|
||||
|
||||
MdnsSocketProvider(@NonNull Context context, @NonNull Looper looper,
|
||||
@NonNull Dependencies deps) {
|
||||
@NonNull Dependencies deps, @NonNull SharedLog sharedLog) {
|
||||
mContext = context;
|
||||
mLooper = looper;
|
||||
mHandler = new Handler(looper);
|
||||
mDependencies = deps;
|
||||
mSharedLog = sharedLog;
|
||||
mNetworkCallback = new NetworkCallback() {
|
||||
@Override
|
||||
public void onLost(Network network) {
|
||||
@@ -135,8 +136,8 @@ public class MdnsSocketProvider {
|
||||
}
|
||||
};
|
||||
|
||||
mSocketNetlinkMonitor = mDependencies.createSocketNetlinkMonitor(mHandler, LOGGER,
|
||||
new NetLinkMessageProcessor());
|
||||
mSocketNetlinkMonitor = mDependencies.createSocketNetlinkMonitor(mHandler,
|
||||
mSharedLog.forSubComponent("NetlinkMonitor"), new NetLinkMessageProcessor());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -253,7 +254,7 @@ public class MdnsSocketProvider {
|
||||
Log.d(TAG, "Already monitoring sockets.");
|
||||
return;
|
||||
}
|
||||
LOGGER.i("Start monitoring sockets.");
|
||||
mSharedLog.i("Start monitoring sockets.");
|
||||
mContext.getSystemService(ConnectivityManager.class).registerNetworkCallback(
|
||||
new NetworkRequest.Builder().clearCapabilities().build(),
|
||||
mNetworkCallback, mHandler);
|
||||
@@ -282,7 +283,7 @@ public class MdnsSocketProvider {
|
||||
|
||||
// Only unregister the network callback if there is no socket request.
|
||||
if (mCallbacksToRequestedNetworks.isEmpty()) {
|
||||
LOGGER.i("Stop monitoring sockets.");
|
||||
mSharedLog.i("Stop monitoring sockets.");
|
||||
mContext.getSystemService(ConnectivityManager.class)
|
||||
.unregisterNetworkCallback(mNetworkCallback);
|
||||
|
||||
@@ -420,7 +421,7 @@ public class MdnsSocketProvider {
|
||||
return;
|
||||
}
|
||||
|
||||
LOGGER.log("Create socket on net:" + networkKey + ", ifName:" + interfaceName);
|
||||
mSharedLog.log("Create socket on net:" + networkKey + ", ifName:" + interfaceName);
|
||||
final MdnsInterfaceSocket socket = mDependencies.createMdnsInterfaceSocket(
|
||||
networkInterface.getNetworkInterface(), MdnsConstants.MDNS_PORT, mLooper,
|
||||
mPacketReadBuffer);
|
||||
@@ -441,7 +442,7 @@ public class MdnsSocketProvider {
|
||||
notifySocketCreated(((NetworkAsKey) networkKey).mNetwork, socket, addresses);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
LOGGER.e("Create socket failed ifName:" + interfaceName, e);
|
||||
mSharedLog.e("Create socket failed ifName:" + interfaceName, e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -470,7 +471,7 @@ public class MdnsSocketProvider {
|
||||
// transports above in priority.
|
||||
return iface.supportsMulticast();
|
||||
} catch (SocketException e) {
|
||||
LOGGER.e("Error checking interface flags", e);
|
||||
mSharedLog.e("Error checking interface flags", e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -481,7 +482,7 @@ public class MdnsSocketProvider {
|
||||
|
||||
socketInfo.mSocket.destroy();
|
||||
notifyInterfaceDestroyed(network, socketInfo.mSocket);
|
||||
LOGGER.log("Remove socket on net:" + network);
|
||||
mSharedLog.log("Remove socket on net:" + network);
|
||||
}
|
||||
|
||||
private void removeTetherInterfaceSocket(String interfaceName) {
|
||||
@@ -489,7 +490,7 @@ public class MdnsSocketProvider {
|
||||
if (socketInfo == null) return;
|
||||
socketInfo.mSocket.destroy();
|
||||
notifyInterfaceDestroyed(null /* network */, socketInfo.mSocket);
|
||||
LOGGER.log("Remove socket on ifName:" + interfaceName);
|
||||
mSharedLog.log("Remove socket on ifName:" + interfaceName);
|
||||
}
|
||||
|
||||
private void notifySocketCreated(Network network, MdnsInterfaceSocket socket,
|
||||
@@ -561,6 +562,7 @@ public class MdnsSocketProvider {
|
||||
*/
|
||||
public void requestSocket(@Nullable Network network, @NonNull SocketCallback cb) {
|
||||
ensureRunningOnHandlerThread(mHandler);
|
||||
mSharedLog.log("requestSocket for net:" + network);
|
||||
mCallbacksToRequestedNetworks.put(cb, network);
|
||||
if (network == null) {
|
||||
// Does not specify a required network, create sockets for all possible
|
||||
@@ -584,6 +586,7 @@ public class MdnsSocketProvider {
|
||||
/*** Unrequest the socket */
|
||||
public void unrequestSocket(@NonNull SocketCallback cb) {
|
||||
ensureRunningOnHandlerThread(mHandler);
|
||||
mSharedLog.log("unrequestSocket");
|
||||
mCallbacksToRequestedNetworks.remove(cb);
|
||||
if (hasAllNetworksRequest()) {
|
||||
// Still has a request for all networks (interfaces).
|
||||
@@ -598,7 +601,7 @@ public class MdnsSocketProvider {
|
||||
info.mSocket.destroy();
|
||||
// Still notify to unrequester for socket destroy.
|
||||
cb.onInterfaceDestroyed(network, info.mSocket);
|
||||
LOGGER.log("Remove socket on net:" + network + " after unrequestSocket");
|
||||
mSharedLog.log("Remove socket on net:" + network + " after unrequestSocket");
|
||||
}
|
||||
|
||||
// Remove all sockets for tethering interface because these sockets do not have associated
|
||||
@@ -609,7 +612,7 @@ public class MdnsSocketProvider {
|
||||
info.mSocket.destroy();
|
||||
// Still notify to unrequester for socket destroy.
|
||||
cb.onInterfaceDestroyed(null /* network */, info.mSocket);
|
||||
LOGGER.log("Remove socket on ifName:" + mTetherInterfaceSockets.keyAt(i)
|
||||
mSharedLog.log("Remove socket on ifName:" + mTetherInterfaceSockets.keyAt(i)
|
||||
+ " after unrequestSocket");
|
||||
}
|
||||
mTetherInterfaceSockets.clear();
|
||||
@@ -618,10 +621,6 @@ public class MdnsSocketProvider {
|
||||
maybeStopMonitoringSockets();
|
||||
}
|
||||
|
||||
/** Dump info to dumpsys */
|
||||
public void dump(PrintWriter pw) {
|
||||
LOGGER.reverseDump(pw);
|
||||
}
|
||||
|
||||
/*** Callbacks for listening socket changes */
|
||||
public interface SocketCallback {
|
||||
|
||||
@@ -175,9 +175,9 @@ public class NsdServiceTest {
|
||||
doReturn(true).when(mMockMDnsM).resolve(
|
||||
anyInt(), anyString(), anyString(), anyString(), anyInt());
|
||||
doReturn(false).when(mDeps).isMdnsDiscoveryManagerEnabled(any(Context.class));
|
||||
doReturn(mDiscoveryManager).when(mDeps).makeMdnsDiscoveryManager(any(), any());
|
||||
doReturn(mSocketProvider).when(mDeps).makeMdnsSocketProvider(any(), any());
|
||||
doReturn(mAdvertiser).when(mDeps).makeMdnsAdvertiser(any(), any(), any());
|
||||
doReturn(mDiscoveryManager).when(mDeps).makeMdnsDiscoveryManager(any(), any(), any());
|
||||
doReturn(mSocketProvider).when(mDeps).makeMdnsSocketProvider(any(), any(), any());
|
||||
doReturn(mAdvertiser).when(mDeps).makeMdnsAdvertiser(any(), any(), any(), any());
|
||||
|
||||
mService = makeService();
|
||||
}
|
||||
@@ -1122,7 +1122,7 @@ public class NsdServiceTest {
|
||||
// final String serviceTypeWithLocalDomain = SERVICE_TYPE + ".local";
|
||||
final ArgumentCaptor<MdnsAdvertiser.AdvertiserCallback> cbCaptor =
|
||||
ArgumentCaptor.forClass(MdnsAdvertiser.AdvertiserCallback.class);
|
||||
verify(mDeps).makeMdnsAdvertiser(any(), any(), cbCaptor.capture());
|
||||
verify(mDeps).makeMdnsAdvertiser(any(), any(), cbCaptor.capture(), any());
|
||||
|
||||
final NsdServiceInfo regInfo = new NsdServiceInfo(SERVICE_NAME, SERVICE_TYPE);
|
||||
regInfo.setHost(parseNumericAddress("192.0.2.123"));
|
||||
@@ -1161,7 +1161,7 @@ public class NsdServiceTest {
|
||||
// final String serviceTypeWithLocalDomain = SERVICE_TYPE + ".local";
|
||||
final ArgumentCaptor<MdnsAdvertiser.AdvertiserCallback> cbCaptor =
|
||||
ArgumentCaptor.forClass(MdnsAdvertiser.AdvertiserCallback.class);
|
||||
verify(mDeps).makeMdnsAdvertiser(any(), any(), cbCaptor.capture());
|
||||
verify(mDeps).makeMdnsAdvertiser(any(), any(), cbCaptor.capture(), any());
|
||||
|
||||
final NsdServiceInfo regInfo = new NsdServiceInfo(SERVICE_NAME, "invalid_type");
|
||||
regInfo.setHost(parseNumericAddress("192.0.2.123"));
|
||||
@@ -1186,7 +1186,7 @@ public class NsdServiceTest {
|
||||
// final String serviceTypeWithLocalDomain = SERVICE_TYPE + ".local";
|
||||
final ArgumentCaptor<MdnsAdvertiser.AdvertiserCallback> cbCaptor =
|
||||
ArgumentCaptor.forClass(MdnsAdvertiser.AdvertiserCallback.class);
|
||||
verify(mDeps).makeMdnsAdvertiser(any(), any(), cbCaptor.capture());
|
||||
verify(mDeps).makeMdnsAdvertiser(any(), any(), cbCaptor.capture(), any());
|
||||
|
||||
final NsdServiceInfo regInfo = new NsdServiceInfo("a".repeat(70), SERVICE_TYPE);
|
||||
regInfo.setHost(parseNumericAddress("192.0.2.123"));
|
||||
|
||||
@@ -23,11 +23,13 @@ import android.net.nsd.NsdServiceInfo
|
||||
import android.os.Build
|
||||
import android.os.Handler
|
||||
import android.os.HandlerThread
|
||||
import com.android.net.module.util.SharedLog
|
||||
import com.android.server.connectivity.mdns.MdnsAdvertiser.AdvertiserCallback
|
||||
import com.android.server.connectivity.mdns.MdnsSocketProvider.SocketCallback
|
||||
import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo
|
||||
import com.android.testutils.DevSdkIgnoreRunner
|
||||
import com.android.testutils.waitForIdle
|
||||
import java.net.NetworkInterface
|
||||
import java.util.Objects
|
||||
import org.junit.After
|
||||
import org.junit.Before
|
||||
@@ -89,6 +91,7 @@ class MdnsAdvertiserTest {
|
||||
private val handler by lazy { Handler(thread.looper) }
|
||||
private val socketProvider = mock(MdnsSocketProvider::class.java)
|
||||
private val cb = mock(AdvertiserCallback::class.java)
|
||||
private val sharedlog = mock(SharedLog::class.java)
|
||||
|
||||
private val mockSocket1 = mock(MdnsInterfaceSocket::class.java)
|
||||
private val mockSocket2 = mock(MdnsInterfaceSocket::class.java)
|
||||
@@ -101,13 +104,15 @@ class MdnsAdvertiserTest {
|
||||
thread.start()
|
||||
doReturn(TEST_HOSTNAME).`when`(mockDeps).generateHostname()
|
||||
doReturn(mockInterfaceAdvertiser1).`when`(mockDeps).makeAdvertiser(eq(mockSocket1),
|
||||
any(), any(), any(), any(), eq(TEST_HOSTNAME)
|
||||
any(), any(), any(), any(), eq(TEST_HOSTNAME), any()
|
||||
)
|
||||
doReturn(mockInterfaceAdvertiser2).`when`(mockDeps).makeAdvertiser(eq(mockSocket2),
|
||||
any(), any(), any(), any(), eq(TEST_HOSTNAME)
|
||||
any(), any(), any(), any(), eq(TEST_HOSTNAME), any()
|
||||
)
|
||||
doReturn(true).`when`(mockInterfaceAdvertiser1).isProbing(anyInt())
|
||||
doReturn(true).`when`(mockInterfaceAdvertiser2).isProbing(anyInt())
|
||||
doReturn(createEmptyNetworkInterface()).`when`(mockSocket1).getInterface()
|
||||
doReturn(createEmptyNetworkInterface()).`when`(mockSocket2).getInterface()
|
||||
}
|
||||
|
||||
@After
|
||||
@@ -116,9 +121,15 @@ class MdnsAdvertiserTest {
|
||||
thread.join()
|
||||
}
|
||||
|
||||
private fun createEmptyNetworkInterface(): NetworkInterface {
|
||||
val constructor = NetworkInterface::class.java.getDeclaredConstructor()
|
||||
constructor.isAccessible = true
|
||||
return constructor.newInstance()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testAddService_OneNetwork() {
|
||||
val advertiser = MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps)
|
||||
val advertiser = MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps, sharedlog)
|
||||
postSync { advertiser.addService(SERVICE_ID_1, SERVICE_1) }
|
||||
|
||||
val socketCbCaptor = ArgumentCaptor.forClass(SocketCallback::class.java)
|
||||
@@ -134,7 +145,8 @@ class MdnsAdvertiserTest {
|
||||
eq(thread.looper),
|
||||
any(),
|
||||
intAdvCbCaptor.capture(),
|
||||
eq(TEST_HOSTNAME)
|
||||
eq(TEST_HOSTNAME),
|
||||
any()
|
||||
)
|
||||
|
||||
doReturn(false).`when`(mockInterfaceAdvertiser1).isProbing(SERVICE_ID_1)
|
||||
@@ -148,7 +160,7 @@ class MdnsAdvertiserTest {
|
||||
|
||||
@Test
|
||||
fun testAddService_AllNetworks() {
|
||||
val advertiser = MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps)
|
||||
val advertiser = MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps, sharedlog)
|
||||
postSync { advertiser.addService(SERVICE_ID_1, ALL_NETWORKS_SERVICE) }
|
||||
|
||||
val socketCbCaptor = ArgumentCaptor.forClass(SocketCallback::class.java)
|
||||
@@ -162,10 +174,10 @@ class MdnsAdvertiserTest {
|
||||
val intAdvCbCaptor1 = ArgumentCaptor.forClass(MdnsInterfaceAdvertiser.Callback::class.java)
|
||||
val intAdvCbCaptor2 = ArgumentCaptor.forClass(MdnsInterfaceAdvertiser.Callback::class.java)
|
||||
verify(mockDeps).makeAdvertiser(eq(mockSocket1), eq(listOf(TEST_LINKADDR)),
|
||||
eq(thread.looper), any(), intAdvCbCaptor1.capture(), eq(TEST_HOSTNAME)
|
||||
eq(thread.looper), any(), intAdvCbCaptor1.capture(), eq(TEST_HOSTNAME), any()
|
||||
)
|
||||
verify(mockDeps).makeAdvertiser(eq(mockSocket2), eq(listOf(TEST_LINKADDR)),
|
||||
eq(thread.looper), any(), intAdvCbCaptor2.capture(), eq(TEST_HOSTNAME)
|
||||
eq(thread.looper), any(), intAdvCbCaptor2.capture(), eq(TEST_HOSTNAME), any()
|
||||
)
|
||||
|
||||
doReturn(false).`when`(mockInterfaceAdvertiser1).isProbing(SERVICE_ID_1)
|
||||
@@ -194,7 +206,7 @@ class MdnsAdvertiserTest {
|
||||
|
||||
@Test
|
||||
fun testAddService_Conflicts() {
|
||||
val advertiser = MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps)
|
||||
val advertiser = MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps, sharedlog)
|
||||
postSync { advertiser.addService(SERVICE_ID_1, SERVICE_1) }
|
||||
|
||||
val oneNetSocketCbCaptor = ArgumentCaptor.forClass(SocketCallback::class.java)
|
||||
@@ -233,7 +245,7 @@ class MdnsAdvertiserTest {
|
||||
|
||||
val intAdvCbCaptor = ArgumentCaptor.forClass(MdnsInterfaceAdvertiser.Callback::class.java)
|
||||
verify(mockDeps).makeAdvertiser(eq(mockSocket1), eq(listOf(TEST_LINKADDR)),
|
||||
eq(thread.looper), any(), intAdvCbCaptor.capture(), eq(TEST_HOSTNAME)
|
||||
eq(thread.looper), any(), intAdvCbCaptor.capture(), eq(TEST_HOSTNAME), any()
|
||||
)
|
||||
verify(mockInterfaceAdvertiser1).addService(eq(SERVICE_ID_1),
|
||||
argThat { it.matches(SERVICE_1) })
|
||||
@@ -264,7 +276,7 @@ class MdnsAdvertiserTest {
|
||||
|
||||
@Test
|
||||
fun testRemoveService_whenAllServiceRemoved_thenUpdateHostName() {
|
||||
val advertiser = MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps)
|
||||
val advertiser = MdnsAdvertiser(thread.looper, socketProvider, cb, mockDeps, sharedlog)
|
||||
verify(mockDeps, times(1)).generateHostname()
|
||||
postSync { advertiser.addService(SERVICE_ID_1, SERVICE_1) }
|
||||
postSync { advertiser.removeService(SERVICE_ID_1) }
|
||||
|
||||
@@ -29,6 +29,7 @@ import android.net.Network;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Pair;
|
||||
|
||||
import com.android.net.module.util.SharedLog;
|
||||
import com.android.server.connectivity.mdns.MdnsSocketClientBase.SocketCreationCallback;
|
||||
import com.android.testutils.DevSdkIgnoreRule;
|
||||
import com.android.testutils.DevSdkIgnoreRunner;
|
||||
@@ -74,13 +75,14 @@ public class MdnsDiscoveryManagerTests {
|
||||
|
||||
@Mock MdnsServiceBrowserListener mockListenerOne;
|
||||
@Mock MdnsServiceBrowserListener mockListenerTwo;
|
||||
@Mock SharedLog sharedLog;
|
||||
private MdnsDiscoveryManager discoveryManager;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
|
||||
discoveryManager = new MdnsDiscoveryManager(executorProvider, socketClient) {
|
||||
discoveryManager = new MdnsDiscoveryManager(executorProvider, socketClient, sharedLog) {
|
||||
@Override
|
||||
MdnsServiceTypeClient createServiceTypeClient(@NonNull String serviceType,
|
||||
@Nullable Network network) {
|
||||
|
||||
@@ -76,7 +76,7 @@ class MdnsInterfaceAdvertiserTest {
|
||||
private val replySender = mock(MdnsReplySender::class.java)
|
||||
private val announcer = mock(MdnsAnnouncer::class.java)
|
||||
private val prober = mock(MdnsProber::class.java)
|
||||
private val sharedlog = mock(SharedLog::class.java)
|
||||
private val sharedlog = SharedLog("MdnsInterfaceAdvertiserTest")
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
private val probeCbCaptor = ArgumentCaptor.forClass(PacketRepeaterCallback::class.java)
|
||||
as ArgumentCaptor<PacketRepeaterCallback<ProbingInfo>>
|
||||
@@ -92,7 +92,6 @@ class MdnsInterfaceAdvertiserTest {
|
||||
|
||||
private val advertiser by lazy {
|
||||
MdnsInterfaceAdvertiser(
|
||||
LOG_TAG,
|
||||
socket,
|
||||
TEST_ADDRS,
|
||||
thread.looper,
|
||||
@@ -116,6 +115,7 @@ class MdnsInterfaceAdvertiserTest {
|
||||
val knownServices = mutableSetOf<Int>()
|
||||
doAnswer { inv ->
|
||||
knownServices.add(inv.getArgument(0))
|
||||
|
||||
-1
|
||||
}.`when`(repository).addService(anyInt(), any())
|
||||
doAnswer { inv ->
|
||||
|
||||
@@ -111,6 +111,7 @@ public class MdnsSocketProviderTest {
|
||||
private MdnsSocketProvider mSocketProvider;
|
||||
private NetworkCallback mNetworkCallback;
|
||||
private TetheringEventCallback mTetheringEventCallback;
|
||||
private SharedLog mLog = new SharedLog("MdnsSocketProviderTest");
|
||||
|
||||
private TestNetlinkMonitor mTestSocketNetLinkMonitor;
|
||||
@Before
|
||||
@@ -153,7 +154,7 @@ public class MdnsSocketProviderTest {
|
||||
return mTestSocketNetLinkMonitor;
|
||||
}).when(mDeps).createSocketNetlinkMonitor(any(), any(),
|
||||
any());
|
||||
mSocketProvider = new MdnsSocketProvider(mContext, thread.getLooper(), mDeps);
|
||||
mSocketProvider = new MdnsSocketProvider(mContext, thread.getLooper(), mDeps, mLog);
|
||||
}
|
||||
|
||||
private void startMonitoringSockets() {
|
||||
|
||||
Reference in New Issue
Block a user