From 4c2d2d5461a1cc878f07ed6bd6cca8ecd0bb2593 Mon Sep 17 00:00:00 2001 From: junyulai Date: Tue, 16 Oct 2018 22:58:07 +0800 Subject: [PATCH] Extend onDnsEvent callback to report more fields. When native layer reports onDnsEvent, netId, eventType and returnCode are available only in NetdEventListenerService, but not for the clients who register event on it. Thus, extend the callback to give clients more detail on the network the look up was performed on and the result of the lookup. Bug: 113916551 Test: 1. runtest frameworks-net 2. runtest frameworks-services -c com.android.server. \ net.watchlist.NetworkWatchlistServiceTests Change-Id: If7beecea50e1baf18cb5c6775ad3ecb1a60b312a --- core/java/android/net/INetdEventCallback.aidl | 9 +++++++-- .../com/android/server/net/BaseNetdEventCallback.java | 4 ++-- .../server/connectivity/NetdEventListenerService.java | 3 ++- .../server/net/watchlist/NetworkWatchlistService.java | 4 ++-- .../android/server/devicepolicy/NetworkLogger.java | 4 ++-- .../net/watchlist/NetworkWatchlistServiceTests.java | 11 +++++++---- 6 files changed, 22 insertions(+), 13 deletions(-) diff --git a/core/java/android/net/INetdEventCallback.aidl b/core/java/android/net/INetdEventCallback.aidl index 1e75bf461a705..4b1a08ded9d6a 100644 --- a/core/java/android/net/INetdEventCallback.aidl +++ b/core/java/android/net/INetdEventCallback.aidl @@ -28,6 +28,11 @@ oneway interface INetdEventCallback { * Reports a single DNS lookup function call. * This method must not block or perform long-running operations. * + * @param netId the ID of the network the lookup was performed on. + * @param eventType one of the EVENT_* constants in {@link INetdEventListener}. + * @param returnCode the return value of the query, may vary based on {@code eventType}. See + * {@code getaddrinfo()}, {@code gethostbyaddr()} and {@code gethostbyname()} section in + * bionic/libc/include/netdb.h. * @param hostname the name that was looked up. * @param ipAddresses (possibly a subset of) the IP addresses returned. * At most {@link #DNS_REPORTED_IP_ADDRESSES_LIMIT} addresses are logged. @@ -36,8 +41,8 @@ oneway interface INetdEventCallback { * @param timestamp the timestamp at which the query was reported by netd. * @param uid the UID of the application that performed the query. */ - void onDnsEvent(String hostname, in String[] ipAddresses, int ipAddressesCount, long timestamp, - int uid); + void onDnsEvent(int netId, int eventType, int returnCode, String hostname, + in String[] ipAddresses, int ipAddressesCount, long timestamp, int uid); /** * Represents a private DNS validation success or failure. diff --git a/core/java/com/android/server/net/BaseNetdEventCallback.java b/core/java/com/android/server/net/BaseNetdEventCallback.java index fdba2f3dc9e61..97247aada49d5 100644 --- a/core/java/com/android/server/net/BaseNetdEventCallback.java +++ b/core/java/com/android/server/net/BaseNetdEventCallback.java @@ -26,8 +26,8 @@ import android.net.INetdEventCallback; */ public class BaseNetdEventCallback extends INetdEventCallback.Stub { @Override - public void onDnsEvent(String hostname, String[] ipAddresses, - int ipAddressesCount, long timestamp, int uid) { + public void onDnsEvent(int netId, int eventType, int returnCode, String hostname, + String[] ipAddresses, int ipAddressesCount, long timestamp, int uid) { // default no-op } diff --git a/services/core/java/com/android/server/connectivity/NetdEventListenerService.java b/services/core/java/com/android/server/connectivity/NetdEventListenerService.java index 4f31e533f8f97..422f5566eee18 100644 --- a/services/core/java/com/android/server/connectivity/NetdEventListenerService.java +++ b/services/core/java/com/android/server/connectivity/NetdEventListenerService.java @@ -208,7 +208,8 @@ public class NetdEventListenerService extends INetdEventListener.Stub { for (INetdEventCallback callback : mNetdEventCallbackList) { if (callback != null) { - callback.onDnsEvent(hostname, ipAddresses, ipAddressesCount, timestamp, uid); + callback.onDnsEvent(netId, eventType, returnCode, hostname, ipAddresses, + ipAddressesCount, timestamp, uid); } } } diff --git a/services/core/java/com/android/server/net/watchlist/NetworkWatchlistService.java b/services/core/java/com/android/server/net/watchlist/NetworkWatchlistService.java index 29b1339e8022c..fa90e9055f044 100644 --- a/services/core/java/com/android/server/net/watchlist/NetworkWatchlistService.java +++ b/services/core/java/com/android/server/net/watchlist/NetworkWatchlistService.java @@ -142,8 +142,8 @@ public class NetworkWatchlistService extends INetworkWatchlistManager.Stub { private final INetdEventCallback mNetdEventCallback = new BaseNetdEventCallback() { @Override - public void onDnsEvent(String hostname, String[] ipAddresses, int ipAddressesCount, - long timestamp, int uid) { + public void onDnsEvent(int netId, int eventType, int returnCode, String hostname, + String[] ipAddresses, int ipAddressesCount, long timestamp, int uid) { if (!mIsLoggingEnabled) { return; } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/NetworkLogger.java b/services/devicepolicy/java/com/android/server/devicepolicy/NetworkLogger.java index 0967652fb215b..d8c2ad899c261 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/NetworkLogger.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/NetworkLogger.java @@ -53,8 +53,8 @@ final class NetworkLogger { private final INetdEventCallback mNetdEventCallback = new BaseNetdEventCallback() { @Override - public void onDnsEvent(String hostname, String[] ipAddresses, int ipAddressesCount, - long timestamp, int uid) { + public void onDnsEvent(int netId, int eventType, int returnCode, String hostname, + String[] ipAddresses, int ipAddressesCount, long timestamp, int uid) { if (!mIsLoggingEnabled.get()) { return; } diff --git a/services/tests/servicestests/src/com/android/server/net/watchlist/NetworkWatchlistServiceTests.java b/services/tests/servicestests/src/com/android/server/net/watchlist/NetworkWatchlistServiceTests.java index ccd3cdd3a20bf..a802ff75a19fc 100644 --- a/services/tests/servicestests/src/com/android/server/net/watchlist/NetworkWatchlistServiceTests.java +++ b/services/tests/servicestests/src/com/android/server/net/watchlist/NetworkWatchlistServiceTests.java @@ -51,7 +51,9 @@ import java.util.concurrent.TimeUnit; @MediumTest public class NetworkWatchlistServiceTests { - private static final long NETWOR_EVENT_TIMEOUT_SEC = 1; + private static final long NETWORK_EVENT_TIMEOUT_SEC = 1; + private static final int TEST_NETID = 100; + private static final int TEST_EVENT_TYPE = 1; private static final String TEST_HOST = "testhost.com"; private static final String TEST_IP = "7.6.8.9"; private static final String[] TEST_IPS = @@ -180,8 +182,9 @@ public class NetworkWatchlistServiceTests { } }; mWatchlistService.mNetworkWatchlistHandler = testDnsHandler; - connectivityMetrics.callback.onDnsEvent(TEST_HOST, TEST_IPS, TEST_IPS.length, 123L, 456); - if (!testDnsLatch.await(NETWOR_EVENT_TIMEOUT_SEC, TimeUnit.SECONDS)) { + connectivityMetrics.callback.onDnsEvent(TEST_NETID, TEST_EVENT_TYPE, 0, + TEST_HOST, TEST_IPS, TEST_IPS.length, 123L, 456); + if (!testDnsLatch.await(NETWORK_EVENT_TIMEOUT_SEC, TimeUnit.SECONDS)) { fail("Timed out waiting for network event"); } assertEquals(TEST_HOST, dnsParams[0]); @@ -206,7 +209,7 @@ public class NetworkWatchlistServiceTests { }; mWatchlistService.mNetworkWatchlistHandler = testConnectHandler; connectivityMetrics.callback.onConnectEvent(TEST_IP, 80, 123L, 456); - if (!testConnectLatch.await(NETWOR_EVENT_TIMEOUT_SEC, TimeUnit.SECONDS)) { + if (!testConnectLatch.await(NETWORK_EVENT_TIMEOUT_SEC, TimeUnit.SECONDS)) { fail("Timed out waiting for network event"); } assertNull(connectParams[0]);