From 643edb6715120db408d525358929331d5329d9e2 Mon Sep 17 00:00:00 2001 From: Remi NGUYEN VAN Date: Mon, 23 Jan 2023 19:14:57 +0900 Subject: [PATCH] Do not return found services on dummy0 When registering and advertising a service on the same device, it is possible for NsdService to find the service on the dummy0 interface. It is however unusable and not resolveable. Skip callbacks on the dummy0 interface as they would confuse apps and tests. Bug: 266176036 Test: atest NsdServiceTest Change-Id: I98cca0135e0f6936187d45707cbdad7a7f263ff1 --- .../src/com/android/server/NsdService.java | 6 ++++ .../com/android/server/NsdServiceTest.java | 29 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/service-t/src/com/android/server/NsdService.java b/service-t/src/com/android/server/NsdService.java index ce105cef4a..6885d03c2d 100644 --- a/service-t/src/com/android/server/NsdService.java +++ b/service-t/src/com/android/server/NsdService.java @@ -843,6 +843,12 @@ public class NsdService extends INsdManager.Stub { // interfaces that do not have an associated Network. break; } + if (foundNetId == INetd.DUMMY_NET_ID) { + // Ignore services on the dummy0 interface: they are only seen when + // discovering locally advertised services, and are not reachable + // through that interface. + break; + } setServiceNetworkForCallback(servInfo, info.netId, info.interfaceIdx); clientInfo.onServiceFound(clientId, servInfo); break; diff --git a/tests/unit/java/com/android/server/NsdServiceTest.java b/tests/unit/java/com/android/server/NsdServiceTest.java index a8f8121a7e..a8e3cc88cf 100644 --- a/tests/unit/java/com/android/server/NsdServiceTest.java +++ b/tests/unit/java/com/android/server/NsdServiceTest.java @@ -410,6 +410,35 @@ public class NsdServiceTest { assertEquals(interfaceIdx, resolvedService.getInterfaceIndex()); } + @Test + public void testDiscoverOnBlackholeNetwork() throws Exception { + final NsdManager client = connectClient(mService); + final DiscoveryListener discListener = mock(DiscoveryListener.class); + client.discoverServices(SERVICE_TYPE, PROTOCOL, discListener); + waitForIdle(); + + final IMDnsEventListener eventListener = getEventListener(); + final ArgumentCaptor discIdCaptor = ArgumentCaptor.forClass(Integer.class); + verify(mMockMDnsM).discover(discIdCaptor.capture(), eq(SERVICE_TYPE), + eq(0) /* interfaceIdx */); + // NsdManager uses a separate HandlerThread to dispatch callbacks (on ServiceHandler), so + // this needs to use a timeout + verify(discListener, timeout(TIMEOUT_MS)).onDiscoveryStarted(SERVICE_TYPE); + + final DiscoveryInfo discoveryInfo = new DiscoveryInfo( + discIdCaptor.getValue(), + IMDnsEventListener.SERVICE_FOUND, + SERVICE_NAME, + SERVICE_TYPE, + DOMAIN_NAME, + 123 /* interfaceIdx */, + INetd.DUMMY_NET_ID); // netId of the blackhole network + eventListener.onServiceDiscoveryStatus(discoveryInfo); + waitForIdle(); + + verify(discListener, never()).onServiceFound(any()); + } + @Test public void testServiceRegistrationSuccessfulAndFailed() throws Exception { final NsdManager client = connectClient(mService);