Snap for 6405781 from 44e38183a74427cebf22a6391e3b004e371b401a to sdk-release
Change-Id: I9570566569a30fbce5d6a1a5c2bf87736581caec
diff --git a/Android.bp b/Android.bp
index ccd7d58..ad11334 100644
--- a/Android.bp
+++ b/Android.bp
@@ -16,7 +16,7 @@
srcs: [
"binder/android/net/IDnsResolver.aidl",
"binder/android/net/ResolverHostsParcel.aidl",
- "binder/android/net/ResolverExperimentalOptionsParcel.aidl",
+ "binder/android/net/ResolverOptionsParcel.aidl",
"binder/android/net/ResolverParamsParcel.aidl",
],
imports: [
@@ -25,17 +25,22 @@
backend: {
java: {
apex_available: [
+ "//apex_available:platform",
"com.android.bluetooth.updatable",
],
},
ndk: {
gen_log: true,
+ apex_available: [
+ "com.android.resolv",
+ ],
},
},
versions: [
"1",
"2",
"3",
+ "4",
],
}
@@ -112,7 +117,7 @@
// Link most things statically to minimize our dependence on system ABIs.
stl: "libc++_static",
static_libs: [
- "dnsresolver_aidl_interface-unstable-ndk_platform",
+ "dnsresolver_aidl_interface-ndk_platform",
"libbase",
"libcutils",
"libjsoncpp",
@@ -166,6 +171,7 @@
sanitize: {
cfi: true,
},
+ apex_available: ["com.android.resolv"],
}
cc_library_static {
@@ -178,6 +184,7 @@
srcs: [
"stats.proto",
],
+ apex_available: ["com.android.resolv"],
}
genrule {
@@ -209,6 +216,7 @@
"libgtest_prod", // Used by libstatspush_compat
"libstatspush_compat",
],
+ apex_available: ["com.android.resolv"],
}
filegroup {
@@ -221,11 +229,18 @@
// TODO: Move this test to tests/
cc_test {
name: "resolv_unit_test",
- test_suites: ["device-tests", "mts"],
+ test_suites: [
+ "device-tests",
+ "mts",
+ ],
require_root: true,
// TODO: Drop root privileges and make it be an real unit test.
// TODO: Remove resolv_test_mts_coverage_defaults after mts coverage switched to 64-bit device.
- defaults: ["netd_defaults", "resolv_test_defaults", "resolv_test_mts_coverage_defaults"],
+ defaults: [
+ "netd_defaults",
+ "resolv_test_defaults",
+ "resolv_test_mts_coverage_defaults",
+ ],
srcs: [
"resolv_cache_unit_test.cpp",
"resolv_callback_unit_test.cpp",
diff --git a/DnsProxyListener.cpp b/DnsProxyListener.cpp
index 2046c34..8d09751 100644
--- a/DnsProxyListener.cpp
+++ b/DnsProxyListener.cpp
@@ -355,6 +355,7 @@
const std::string& dnsQueryStats = event.dns_query_events().SerializeAsString();
stats::BytesField dnsQueryBytesField{dnsQueryStats.c_str(), dnsQueryStats.size()};
event.set_return_code(static_cast<ReturnCode>(returnCode));
+ event.set_network_type(resolv_get_network_types_for_net(netContext.dns_netid));
android::net::stats::stats_write(android::net::stats::NETWORK_DNS_EVENT_REPORTED,
event.event_type(), event.return_code(),
event.latency_micros(), event.hints_ai_flags(),
diff --git a/ResolverController.cpp b/ResolverController.cpp
index 22878f3..13600b8 100644
--- a/ResolverController.cpp
+++ b/ResolverController.cpp
@@ -233,7 +233,7 @@
return resolv_set_nameservers(resolverParams.netId, resolverParams.servers,
resolverParams.domains, res_params,
- resolverParams.experimentalOptions);
+ resolverParams.resolverOptions, resolverParams.transportTypes);
}
int ResolverController::getResolverInfo(int32_t netId, std::vector<std::string>* servers,
@@ -362,8 +362,7 @@
dw.decIndent();
}
dw.println("Concurrent DNS query timeout: %d", wait_for_pending_req_timeout_count[0]);
- resolv_stats_dump(dw, netId);
- resolv_oem_options_dump(dw, netId);
+ resolv_netconfig_dump(dw, netId);
}
dw.decIndent();
}
diff --git a/aidl_api/dnsresolver_aidl_interface/4/.hash b/aidl_api/dnsresolver_aidl_interface/4/.hash
new file mode 100644
index 0000000..c0a6b10
--- /dev/null
+++ b/aidl_api/dnsresolver_aidl_interface/4/.hash
@@ -0,0 +1 @@
+012d220dd2a6736ed40b8653351386cece8458f7
diff --git a/aidl_api/dnsresolver_aidl_interface/4/android/net/IDnsResolver.aidl b/aidl_api/dnsresolver_aidl_interface/4/android/net/IDnsResolver.aidl
new file mode 100644
index 0000000..9eb65de
--- /dev/null
+++ b/aidl_api/dnsresolver_aidl_interface/4/android/net/IDnsResolver.aidl
@@ -0,0 +1,63 @@
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL interface (or parcelable). Do not try to
+// edit this file. It looks like you are doing that because you have modified
+// an AIDL interface in a backward-incompatible way, e.g., deleting a function
+// from an interface or a field from a parcelable and it broke the build. That
+// breakage is intended.
+//
+// You must not make a backward incompatible changes to the AIDL files built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.net;
+/* @hide */
+interface IDnsResolver {
+ boolean isAlive();
+ void registerEventListener(android.net.metrics.INetdEventListener listener);
+ void setResolverConfiguration(in android.net.ResolverParamsParcel resolverParams);
+ void getResolverInfo(int netId, out @utf8InCpp String[] servers, out @utf8InCpp String[] domains, out @utf8InCpp String[] tlsServers, out int[] params, out int[] stats, out int[] wait_for_pending_req_timeout_count);
+ void startPrefix64Discovery(int netId);
+ void stopPrefix64Discovery(int netId);
+ @utf8InCpp String getPrefix64(int netId);
+ void createNetworkCache(int netId);
+ void destroyNetworkCache(int netId);
+ void setLogSeverity(int logSeverity);
+ void flushNetworkCache(int netId);
+ const int RESOLVER_PARAMS_SAMPLE_VALIDITY = 0;
+ const int RESOLVER_PARAMS_SUCCESS_THRESHOLD = 1;
+ const int RESOLVER_PARAMS_MIN_SAMPLES = 2;
+ const int RESOLVER_PARAMS_MAX_SAMPLES = 3;
+ const int RESOLVER_PARAMS_BASE_TIMEOUT_MSEC = 4;
+ const int RESOLVER_PARAMS_RETRY_COUNT = 5;
+ const int RESOLVER_PARAMS_COUNT = 6;
+ const int RESOLVER_STATS_SUCCESSES = 0;
+ const int RESOLVER_STATS_ERRORS = 1;
+ const int RESOLVER_STATS_TIMEOUTS = 2;
+ const int RESOLVER_STATS_INTERNAL_ERRORS = 3;
+ const int RESOLVER_STATS_RTT_AVG = 4;
+ const int RESOLVER_STATS_LAST_SAMPLE_TIME = 5;
+ const int RESOLVER_STATS_USABLE = 6;
+ const int RESOLVER_STATS_COUNT = 7;
+ const int DNS_RESOLVER_LOG_VERBOSE = 0;
+ const int DNS_RESOLVER_LOG_DEBUG = 1;
+ const int DNS_RESOLVER_LOG_INFO = 2;
+ const int DNS_RESOLVER_LOG_WARNING = 3;
+ const int DNS_RESOLVER_LOG_ERROR = 4;
+ const int TC_MODE_DEFAULT = 0;
+ const int TC_MODE_UDP_TCP = 1;
+ const int TRANSPORT_UNKNOWN = -1;
+ const int TRANSPORT_CELLULAR = 0;
+ const int TRANSPORT_WIFI = 1;
+ const int TRANSPORT_BLUETOOTH = 2;
+ const int TRANSPORT_ETHERNET = 3;
+ const int TRANSPORT_VPN = 4;
+ const int TRANSPORT_WIFI_AWARE = 5;
+ const int TRANSPORT_LOWPAN = 6;
+ const int TRANSPORT_TEST = 7;
+}
diff --git a/aidl_api/dnsresolver_aidl_interface/current/android/net/ResolverExperimentalOptionsParcel.aidl b/aidl_api/dnsresolver_aidl_interface/4/android/net/ResolverHostsParcel.aidl
similarity index 89%
copy from aidl_api/dnsresolver_aidl_interface/current/android/net/ResolverExperimentalOptionsParcel.aidl
copy to aidl_api/dnsresolver_aidl_interface/4/android/net/ResolverHostsParcel.aidl
index 07a1143..3ab0533 100644
--- a/aidl_api/dnsresolver_aidl_interface/current/android/net/ResolverExperimentalOptionsParcel.aidl
+++ b/aidl_api/dnsresolver_aidl_interface/4/android/net/ResolverHostsParcel.aidl
@@ -17,7 +17,7 @@
package android.net;
/* @hide */
-parcelable ResolverExperimentalOptionsParcel {
- android.net.ResolverHostsParcel[] hosts = {};
- int tcMode = 0;
+parcelable ResolverHostsParcel {
+ @utf8InCpp String ipAddr;
+ @utf8InCpp String hostName = "";
}
diff --git a/aidl_api/dnsresolver_aidl_interface/current/android/net/ResolverExperimentalOptionsParcel.aidl b/aidl_api/dnsresolver_aidl_interface/4/android/net/ResolverOptionsParcel.aidl
similarity index 95%
rename from aidl_api/dnsresolver_aidl_interface/current/android/net/ResolverExperimentalOptionsParcel.aidl
rename to aidl_api/dnsresolver_aidl_interface/4/android/net/ResolverOptionsParcel.aidl
index 07a1143..a13216a 100644
--- a/aidl_api/dnsresolver_aidl_interface/current/android/net/ResolverExperimentalOptionsParcel.aidl
+++ b/aidl_api/dnsresolver_aidl_interface/4/android/net/ResolverOptionsParcel.aidl
@@ -17,7 +17,7 @@
package android.net;
/* @hide */
-parcelable ResolverExperimentalOptionsParcel {
+parcelable ResolverOptionsParcel {
android.net.ResolverHostsParcel[] hosts = {};
int tcMode = 0;
}
diff --git a/aidl_api/dnsresolver_aidl_interface/current/android/net/ResolverExperimentalOptionsParcel.aidl b/aidl_api/dnsresolver_aidl_interface/4/android/net/ResolverParamsParcel.aidl
similarity index 68%
copy from aidl_api/dnsresolver_aidl_interface/current/android/net/ResolverExperimentalOptionsParcel.aidl
copy to aidl_api/dnsresolver_aidl_interface/4/android/net/ResolverParamsParcel.aidl
index 07a1143..5dae1ca 100644
--- a/aidl_api/dnsresolver_aidl_interface/current/android/net/ResolverExperimentalOptionsParcel.aidl
+++ b/aidl_api/dnsresolver_aidl_interface/4/android/net/ResolverParamsParcel.aidl
@@ -17,7 +17,21 @@
package android.net;
/* @hide */
-parcelable ResolverExperimentalOptionsParcel {
- android.net.ResolverHostsParcel[] hosts = {};
- int tcMode = 0;
+parcelable ResolverParamsParcel {
+ int netId;
+ int sampleValiditySeconds;
+ int successThreshold;
+ int minSamples;
+ int maxSamples;
+ int baseTimeoutMsec;
+ int retryCount;
+ @utf8InCpp String[] servers;
+ @utf8InCpp String[] domains;
+ @utf8InCpp String tlsName;
+ @utf8InCpp String[] tlsServers;
+ @utf8InCpp String[] tlsFingerprints = {};
+ @utf8InCpp String caCertificate = "";
+ int tlsConnectTimeoutMs = 0;
+ android.net.ResolverOptionsParcel resolverOptions;
+ int[] transportTypes = {};
}
diff --git a/aidl_api/dnsresolver_aidl_interface/current/android/net/IDnsResolver.aidl b/aidl_api/dnsresolver_aidl_interface/current/android/net/IDnsResolver.aidl
index 0ebc44f..9eb65de 100644
--- a/aidl_api/dnsresolver_aidl_interface/current/android/net/IDnsResolver.aidl
+++ b/aidl_api/dnsresolver_aidl_interface/current/android/net/IDnsResolver.aidl
@@ -51,5 +51,13 @@
const int DNS_RESOLVER_LOG_ERROR = 4;
const int TC_MODE_DEFAULT = 0;
const int TC_MODE_UDP_TCP = 1;
- const int TC_MODE_MAX = 2;
+ const int TRANSPORT_UNKNOWN = -1;
+ const int TRANSPORT_CELLULAR = 0;
+ const int TRANSPORT_WIFI = 1;
+ const int TRANSPORT_BLUETOOTH = 2;
+ const int TRANSPORT_ETHERNET = 3;
+ const int TRANSPORT_VPN = 4;
+ const int TRANSPORT_WIFI_AWARE = 5;
+ const int TRANSPORT_LOWPAN = 6;
+ const int TRANSPORT_TEST = 7;
}
diff --git a/aidl_api/dnsresolver_aidl_interface/current/android/net/ResolverExperimentalOptionsParcel.aidl b/aidl_api/dnsresolver_aidl_interface/current/android/net/ResolverOptionsParcel.aidl
similarity index 95%
copy from aidl_api/dnsresolver_aidl_interface/current/android/net/ResolverExperimentalOptionsParcel.aidl
copy to aidl_api/dnsresolver_aidl_interface/current/android/net/ResolverOptionsParcel.aidl
index 07a1143..a13216a 100644
--- a/aidl_api/dnsresolver_aidl_interface/current/android/net/ResolverExperimentalOptionsParcel.aidl
+++ b/aidl_api/dnsresolver_aidl_interface/current/android/net/ResolverOptionsParcel.aidl
@@ -17,7 +17,7 @@
package android.net;
/* @hide */
-parcelable ResolverExperimentalOptionsParcel {
+parcelable ResolverOptionsParcel {
android.net.ResolverHostsParcel[] hosts = {};
int tcMode = 0;
}
diff --git a/aidl_api/dnsresolver_aidl_interface/current/android/net/ResolverParamsParcel.aidl b/aidl_api/dnsresolver_aidl_interface/current/android/net/ResolverParamsParcel.aidl
index 8d807be..5dae1ca 100644
--- a/aidl_api/dnsresolver_aidl_interface/current/android/net/ResolverParamsParcel.aidl
+++ b/aidl_api/dnsresolver_aidl_interface/current/android/net/ResolverParamsParcel.aidl
@@ -32,5 +32,6 @@
@utf8InCpp String[] tlsFingerprints = {};
@utf8InCpp String caCertificate = "";
int tlsConnectTimeoutMs = 0;
- android.net.ResolverExperimentalOptionsParcel experimentalOptions;
+ android.net.ResolverOptionsParcel resolverOptions;
+ int[] transportTypes = {};
}
diff --git a/binder/android/net/IDnsResolver.aidl b/binder/android/net/IDnsResolver.aidl
index c85e5cf..da13d21 100644
--- a/binder/android/net/IDnsResolver.aidl
+++ b/binder/android/net/IDnsResolver.aidl
@@ -172,14 +172,27 @@
void flushNetworkCache(int netId);
/**
- * Values for {@code tcMode} of {@code ResolverExperimentalOptionsParcel}. It controls the way DNS
+ * Values for {@code tcMode} of {@code ResolverOptionsParcel}. It controls the way DNS
* resolver handles truncated DNS response from UDP connection.
*
* TC_MODE_DEFAULT: resolver retries on TCP-only on each name server.
* TC_MODE_UDP_TCP: resolver retries on TCP on the same server, falls back to UDP from next.
- * TC_MODE_MAX: any value smaller than TC_MODE_DEFAULT or greater than TC_MODE_MAX is invalid.
*/
const int TC_MODE_DEFAULT = 0;
const int TC_MODE_UDP_TCP = 1;
- const int TC_MODE_MAX = 2;
+
+ /**
+ * Values for {@code transportTypes} of {@code ResolverParamsParcel}. These values are
+ * always the same as the TRANSPORT_* API definations of NetworkCapabilities except for
+ * TRANSPORT_UNKNOWN. It controls the transport types for a given network.
+ */
+ const int TRANSPORT_UNKNOWN = -1;
+ const int TRANSPORT_CELLULAR = 0;
+ const int TRANSPORT_WIFI = 1;
+ const int TRANSPORT_BLUETOOTH = 2;
+ const int TRANSPORT_ETHERNET = 3;
+ const int TRANSPORT_VPN = 4;
+ const int TRANSPORT_WIFI_AWARE = 5;
+ const int TRANSPORT_LOWPAN = 6;
+ const int TRANSPORT_TEST = 7;
}
diff --git a/binder/android/net/ResolverExperimentalOptionsParcel.aidl b/binder/android/net/ResolverOptionsParcel.aidl
similarity index 96%
rename from binder/android/net/ResolverExperimentalOptionsParcel.aidl
rename to binder/android/net/ResolverOptionsParcel.aidl
index f8fd589..8e435de 100644
--- a/binder/android/net/ResolverExperimentalOptionsParcel.aidl
+++ b/binder/android/net/ResolverOptionsParcel.aidl
@@ -23,7 +23,7 @@
*
* {@hide}
*/
-parcelable ResolverExperimentalOptionsParcel {
+parcelable ResolverOptionsParcel {
/**
* An IP/hostname mapping table for DNS local lookup customization.
* WARNING: this is intended for local testing and other special situations.
diff --git a/binder/android/net/ResolverParamsParcel.aidl b/binder/android/net/ResolverParamsParcel.aidl
index c42367f..9a8e843 100644
--- a/binder/android/net/ResolverParamsParcel.aidl
+++ b/binder/android/net/ResolverParamsParcel.aidl
@@ -16,7 +16,7 @@
package android.net;
-import android.net.ResolverExperimentalOptionsParcel;
+import android.net.ResolverOptionsParcel;
/**
* Configuration for a resolver parameters.
@@ -101,7 +101,15 @@
int tlsConnectTimeoutMs = 0;
/**
- * Knobs for OEM to control alternative behavior.
- */
- ResolverExperimentalOptionsParcel experimentalOptions;
+ * Knobs for OEM to control alternative behavior.
+ */
+ ResolverOptionsParcel resolverOptions;
+
+ /**
+ * The transport types associated to a given network.
+ * The valid value is defined in one of the IDnsResolver.TRANSPORT_* constants.
+ * If there are multiple transport types but can't be identified to a
+ * reasonable network type by DnsResolver, it would be considered as unknown.
+ */
+ int[] transportTypes = {};
}
diff --git a/res_cache.cpp b/res_cache.cpp
index 7c0a65a..43c268e 100644
--- a/res_cache.cpp
+++ b/res_cache.cpp
@@ -49,6 +49,7 @@
#include <net/if.h>
#include <netdb.h>
+#include <aidl/android/net/IDnsResolver.h>
#include <android-base/logging.h>
#include <android-base/parseint.h>
#include <android-base/stringprintf.h>
@@ -64,6 +65,7 @@
#include "resolv_private.h"
#include "util.h"
+using aidl::android::net::IDnsResolver;
using android::base::StringAppendF;
using android::net::DnsQueryEvent;
using android::net::DnsStats;
@@ -1002,6 +1004,7 @@
// If resolverParams.hosts is empty, the existing customized table will be erased.
HostMapping customizedTable = {};
int tc_mode = aidl::android::net::IDnsResolver::TC_MODE_DEFAULT;
+ std::vector<int32_t> transportTypes;
};
/* gets cache associated with a network, or NULL if none exists */
@@ -1510,6 +1513,13 @@
}
}
+android::net::NetworkType resolv_get_network_types_for_net(unsigned netid) {
+ std::lock_guard guard(cache_mutex);
+ NetConfig* netconfig = find_netconfig_locked(netid);
+ if (netconfig == nullptr) return android::net::NT_UNKNOWN;
+ return convert_network_type(netconfig->transportTypes);
+}
+
namespace {
// Returns valid domains without duplicates which are limited to max size |MAXDNSRCH|.
@@ -1569,10 +1579,10 @@
return result;
}
-int resolv_set_nameservers(
- unsigned netid, const std::vector<std::string>& servers,
- const std::vector<std::string>& domains, const res_params& params,
- const aidl::android::net::ResolverExperimentalOptionsParcel& experimentalOptions) {
+int resolv_set_nameservers(unsigned netid, const std::vector<std::string>& servers,
+ const std::vector<std::string>& domains, const res_params& params,
+ const aidl::android::net::ResolverOptionsParcel& resolverOptions,
+ const std::vector<int32_t>& transportTypes) {
std::vector<std::string> nameservers = filter_nameservers(servers);
const int numservers = static_cast<int>(nameservers.size());
@@ -1626,17 +1636,20 @@
return -EINVAL;
}
netconfig->customizedTable.clear();
- for (const auto& host : experimentalOptions.hosts) {
+ for (const auto& host : resolverOptions.hosts) {
if (!host.hostName.empty() && !host.ipAddr.empty())
netconfig->customizedTable.emplace(host.hostName, host.ipAddr);
}
- if (experimentalOptions.tcMode < aidl::android::net::IDnsResolver::TC_MODE_DEFAULT ||
- experimentalOptions.tcMode >= aidl::android::net::IDnsResolver::TC_MODE_MAX) {
- LOG(WARNING) << __func__ << ": netid = " << netid << ", invalid TC mode";
+ if (resolverOptions.tcMode < aidl::android::net::IDnsResolver::TC_MODE_DEFAULT ||
+ resolverOptions.tcMode > aidl::android::net::IDnsResolver::TC_MODE_UDP_TCP) {
+ LOG(WARNING) << __func__ << ": netid = " << netid
+ << ", invalid TC mode: " << resolverOptions.tcMode;
return -EINVAL;
}
- netconfig->tc_mode = experimentalOptions.tcMode;
+ netconfig->tc_mode = resolverOptions.tcMode;
+
+ netconfig->transportTypes = transportTypes;
return 0;
}
@@ -1892,22 +1905,7 @@
return false;
}
-void resolv_stats_dump(DumpWriter& dw, unsigned netid) {
- std::lock_guard guard(cache_mutex);
- if (const auto info = find_netconfig_locked(netid); info != nullptr) {
- info->dnsStats.dump(dw);
- }
-}
-
-void resolv_oem_options_dump(DumpWriter& dw, unsigned netid) {
- std::lock_guard guard(cache_mutex);
- if (const auto info = find_netconfig_locked(netid); info != nullptr) {
- // TODO: dump info->hosts
- dw.println("TC mode: %s", tc_mode_to_str(info->tc_mode));
- }
-}
-
-const char* tc_mode_to_str(const int mode) {
+static const char* tc_mode_to_str(const int mode) {
switch (mode) {
case aidl::android::net::IDnsResolver::TC_MODE_DEFAULT:
return "default";
@@ -1917,3 +1915,95 @@
return "unknown";
}
}
+
+static android::net::NetworkType to_stats_network_type(int32_t mainType, bool withVpn) {
+ switch (mainType) {
+ case IDnsResolver::TRANSPORT_CELLULAR:
+ return withVpn ? android::net::NT_CELLULAR_VPN : android::net::NT_CELLULAR;
+ case IDnsResolver::TRANSPORT_WIFI:
+ return withVpn ? android::net::NT_WIFI_VPN : android::net::NT_WIFI;
+ case IDnsResolver::TRANSPORT_BLUETOOTH:
+ return withVpn ? android::net::NT_BLUETOOTH_VPN : android::net::NT_BLUETOOTH;
+ case IDnsResolver::TRANSPORT_ETHERNET:
+ return withVpn ? android::net::NT_ETHERNET_VPN : android::net::NT_ETHERNET;
+ case IDnsResolver::TRANSPORT_VPN:
+ return withVpn ? android::net::NT_UNKNOWN : android::net::NT_VPN;
+ case IDnsResolver::TRANSPORT_WIFI_AWARE:
+ return withVpn ? android::net::NT_UNKNOWN : android::net::NT_WIFI_AWARE;
+ case IDnsResolver::TRANSPORT_LOWPAN:
+ return withVpn ? android::net::NT_UNKNOWN : android::net::NT_LOWPAN;
+ default:
+ return android::net::NT_UNKNOWN;
+ }
+}
+
+android::net::NetworkType convert_network_type(const std::vector<int32_t>& transportTypes) {
+ // The valid transportTypes size is 1 to 3.
+ if (transportTypes.size() > 3 || transportTypes.size() == 0) return android::net::NT_UNKNOWN;
+ // TransportTypes size == 1, map the type to stats network type directly.
+ if (transportTypes.size() == 1) return to_stats_network_type(transportTypes[0], false);
+ // TransportTypes size == 3, only cellular + wifi + vpn is valid.
+ if (transportTypes.size() == 3) {
+ std::vector<int32_t> sortedTransTypes = transportTypes;
+ std::sort(sortedTransTypes.begin(), sortedTransTypes.end());
+ if (sortedTransTypes != std::vector<int32_t>{IDnsResolver::TRANSPORT_CELLULAR,
+ IDnsResolver::TRANSPORT_WIFI,
+ IDnsResolver::TRANSPORT_VPN}) {
+ return android::net::NT_UNKNOWN;
+ }
+ return android::net::NT_WIFI_CELLULAR_VPN;
+ }
+ // TransportTypes size == 2, it shoud be 1 main type + vpn type.
+ // Otherwise, consider it as UNKNOWN.
+ bool hasVpn = false;
+ int32_t mainType = IDnsResolver::TRANSPORT_UNKNOWN;
+ for (const auto& transportType : transportTypes) {
+ if (transportType == IDnsResolver::TRANSPORT_VPN) {
+ hasVpn = true;
+ continue;
+ }
+ mainType = transportType;
+ }
+ return hasVpn ? to_stats_network_type(mainType, true) : android::net::NT_UNKNOWN;
+}
+
+static const char* transport_type_to_str(const std::vector<int32_t>& transportTypes) {
+ switch (convert_network_type(transportTypes)) {
+ case android::net::NT_CELLULAR:
+ return "CELLULAR";
+ case android::net::NT_WIFI:
+ return "WIFI";
+ case android::net::NT_BLUETOOTH:
+ return "BLUETOOTH";
+ case android::net::NT_ETHERNET:
+ return "ETHERNET";
+ case android::net::NT_VPN:
+ return "VPN";
+ case android::net::NT_WIFI_AWARE:
+ return "WIFI_AWARE";
+ case android::net::NT_LOWPAN:
+ return "LOWPAN";
+ case android::net::NT_CELLULAR_VPN:
+ return "CELLULAR_VPN";
+ case android::net::NT_WIFI_VPN:
+ return "WIFI_VPN";
+ case android::net::NT_BLUETOOTH_VPN:
+ return "BLUETOOTH_VPN";
+ case android::net::NT_ETHERNET_VPN:
+ return "ETHERNET_VPN";
+ case android::net::NT_WIFI_CELLULAR_VPN:
+ return "WIFI_CELLULAR_VPN";
+ default:
+ return "UNKNOWN";
+ }
+}
+
+void resolv_netconfig_dump(DumpWriter& dw, unsigned netid) {
+ std::lock_guard guard(cache_mutex);
+ if (const auto info = find_netconfig_locked(netid); info != nullptr) {
+ info->dnsStats.dump(dw);
+ // TODO: dump info->hosts
+ dw.println("TC mode: %s", tc_mode_to_str(info->tc_mode));
+ dw.println("TransportType: %s", transport_type_to_str(info->transportTypes));
+ }
+}
diff --git a/resolv_cache.h b/resolv_cache.h
index dd7ede1..49c7f56 100644
--- a/resolv_cache.h
+++ b/resolv_cache.h
@@ -32,7 +32,7 @@
#include <vector>
#include <aidl/android/net/IDnsResolver.h>
-#include <aidl/android/net/ResolverExperimentalOptionsParcel.h>
+#include <aidl/android/net/ResolverOptionsParcel.h>
#include <netdutils/DumpWriter.h>
#include <netdutils/InternetAddresses.h>
@@ -80,11 +80,12 @@
// Sets name servers for a given network.
// TODO: Pass all of ResolverParamsParcel and remove the res_params argument.
-int resolv_set_nameservers(
- unsigned netid, const std::vector<std::string>& servers,
- const std::vector<std::string>& domains, const res_params& params,
- const aidl::android::net::ResolverExperimentalOptionsParcel& experimentalOptions = {
- {} /* hosts */, aidl::android::net::IDnsResolver::TC_MODE_DEFAULT});
+int resolv_set_nameservers(unsigned netid, const std::vector<std::string>& servers,
+ const std::vector<std::string>& domains, const res_params& params,
+ const aidl::android::net::ResolverOptionsParcel& resolverOptions =
+ {{} /* hosts */,
+ aidl::android::net::IDnsResolver::TC_MODE_DEFAULT},
+ const std::vector<int32_t>& transportTypes = {});
// Creates the cache associated with the given network.
int resolv_create_cache_for_net(unsigned netid);
@@ -95,6 +96,9 @@
// Flushes the cache associated with the given network.
int resolv_flush_cache_for_net(unsigned netid);
+// Get transport types to a given network.
+android::net::NetworkType resolv_get_network_types_for_net(unsigned netid);
+
// For test only.
// Return true if the cache is existent in the given network, false otherwise.
bool has_named_cache(unsigned netid);
@@ -111,12 +115,6 @@
bool resolv_stats_add(unsigned netid, const android::netdutils::IPSockAddr& server,
const android::net::DnsQueryEvent* record);
-void resolv_stats_dump(android::netdutils::DumpWriter& dw, unsigned netid);
-
-void resolv_oem_options_dump(android::netdutils::DumpWriter& dw, unsigned netid);
-
-const char* tc_mode_to_str(const int mode);
-
/* Retrieve a local copy of the stats for the given netid. The buffer must have space for
* MAXNS __resolver_stats. Returns the revision id of the resolvers used.
*/
@@ -130,3 +128,9 @@
void resolv_cache_add_resolver_stats_sample(unsigned netid, int revision_id,
const android::netdutils::IPSockAddr& serverSockAddr,
const res_sample& sample, int max_samples);
+
+// Convert TRANSPORT_* to NT_*. It's public only for unit testing.
+android::net::NetworkType convert_network_type(const std::vector<int32_t>& transportTypes);
+
+// Dump net configuration log for a given network.
+void resolv_netconfig_dump(android::netdutils::DumpWriter& dw, unsigned netid);
diff --git a/resolv_cache_unit_test.cpp b/resolv_cache_unit_test.cpp
index 4a29258..6e7ffee 100644
--- a/resolv_cache_unit_test.cpp
+++ b/resolv_cache_unit_test.cpp
@@ -22,6 +22,7 @@
#include <ctime>
#include <thread>
+#include <aidl/android/net/IDnsResolver.h>
#include <android-base/logging.h>
#include <android-base/stringprintf.h>
#include <android/multinetwork.h>
@@ -38,6 +39,7 @@
using namespace std::chrono_literals;
+using aidl::android::net::IDnsResolver;
using android::netdutils::IPSockAddr;
constexpr int TEST_NETID = 30;
@@ -59,6 +61,8 @@
std::vector<std::string> servers;
std::vector<std::string> domains;
res_params params;
+ aidl::android::net::ResolverOptionsParcel resolverOptions;
+ std::vector<int32_t> transportTypes;
};
struct CacheStats {
@@ -189,7 +193,8 @@
}
int cacheSetupResolver(uint32_t netId, const SetupParams& setup) {
- return resolv_set_nameservers(netId, setup.servers, setup.domains, setup.params);
+ return resolv_set_nameservers(netId, setup.servers, setup.domains, setup.params,
+ setup.resolverOptions, setup.transportTypes);
}
void cacheAddStats(uint32_t netId, int revision_id, const IPSockAddr& ipsa,
@@ -834,6 +839,64 @@
EXPECT_STREQ(answer, domain_name);
}
+TEST_F(ResolvCacheTest, GetNetworkTypesForNet) {
+ const SetupParams setup = {
+ .servers = {"127.0.0.1", "::127.0.0.2", "fe80::3"},
+ .domains = {"domain1.com", "domain2.com"},
+ .params = kParams,
+ .transportTypes = {IDnsResolver::TRANSPORT_WIFI, IDnsResolver::TRANSPORT_VPN}};
+ EXPECT_EQ(0, cacheCreate(TEST_NETID));
+ EXPECT_EQ(0, cacheSetupResolver(TEST_NETID, setup));
+ EXPECT_EQ(android::net::NT_WIFI_VPN, resolv_get_network_types_for_net(TEST_NETID));
+}
+
+TEST_F(ResolvCacheTest, ConvertTransportsToNetworkType) {
+ static const struct TestConfig {
+ int32_t networkType;
+ std::vector<int32_t> transportTypes;
+ } testConfigs[] = {
+ {android::net::NT_CELLULAR, {IDnsResolver::TRANSPORT_CELLULAR}},
+ {android::net::NT_WIFI, {IDnsResolver::TRANSPORT_WIFI}},
+ {android::net::NT_BLUETOOTH, {IDnsResolver::TRANSPORT_BLUETOOTH}},
+ {android::net::NT_ETHERNET, {IDnsResolver::TRANSPORT_ETHERNET}},
+ {android::net::NT_VPN, {IDnsResolver::TRANSPORT_VPN}},
+ {android::net::NT_WIFI_AWARE, {IDnsResolver::TRANSPORT_WIFI_AWARE}},
+ {android::net::NT_LOWPAN, {IDnsResolver::TRANSPORT_LOWPAN}},
+ {android::net::NT_CELLULAR_VPN,
+ {IDnsResolver::TRANSPORT_CELLULAR, IDnsResolver::TRANSPORT_VPN}},
+ {android::net::NT_CELLULAR_VPN,
+ {IDnsResolver::TRANSPORT_VPN, IDnsResolver::TRANSPORT_CELLULAR}},
+ {android::net::NT_WIFI_VPN,
+ {IDnsResolver::TRANSPORT_WIFI, IDnsResolver::TRANSPORT_VPN}},
+ {android::net::NT_WIFI_VPN,
+ {IDnsResolver::TRANSPORT_VPN, IDnsResolver::TRANSPORT_WIFI}},
+ {android::net::NT_BLUETOOTH_VPN,
+ {IDnsResolver::TRANSPORT_BLUETOOTH, IDnsResolver::TRANSPORT_VPN}},
+ {android::net::NT_BLUETOOTH_VPN,
+ {IDnsResolver::TRANSPORT_VPN, IDnsResolver::TRANSPORT_BLUETOOTH}},
+ {android::net::NT_ETHERNET_VPN,
+ {IDnsResolver::TRANSPORT_ETHERNET, IDnsResolver::TRANSPORT_VPN}},
+ {android::net::NT_ETHERNET_VPN,
+ {IDnsResolver::TRANSPORT_VPN, IDnsResolver::TRANSPORT_ETHERNET}},
+ {android::net::NT_UNKNOWN, {IDnsResolver::TRANSPORT_VPN, IDnsResolver::TRANSPORT_VPN}},
+ {android::net::NT_UNKNOWN,
+ {IDnsResolver::TRANSPORT_WIFI, IDnsResolver::TRANSPORT_LOWPAN}},
+ {android::net::NT_UNKNOWN, {}},
+ {android::net::NT_UNKNOWN,
+ {IDnsResolver::TRANSPORT_CELLULAR, IDnsResolver::TRANSPORT_BLUETOOTH,
+ IDnsResolver::TRANSPORT_VPN}},
+ {android::net::NT_WIFI_CELLULAR_VPN,
+ {IDnsResolver::TRANSPORT_CELLULAR, IDnsResolver::TRANSPORT_WIFI,
+ IDnsResolver::TRANSPORT_VPN}},
+ {android::net::NT_WIFI_CELLULAR_VPN,
+ {IDnsResolver::TRANSPORT_VPN, IDnsResolver::TRANSPORT_WIFI,
+ IDnsResolver::TRANSPORT_CELLULAR}},
+ };
+ for (const auto& config : testConfigs) {
+ EXPECT_EQ(config.networkType, convert_network_type(config.transportTypes));
+ }
+}
+
namespace {
constexpr int EAI_OK = 0;
diff --git a/stats.proto b/stats.proto
index abca793..403a008 100644
--- a/stats.proto
+++ b/stats.proto
@@ -63,6 +63,13 @@
NS_R_NOTAUTH = 9; // Not authoritative for zone
NS_R_NOTZONE = 10; // Zone of record different from zone section
NS_R_MAX = 11;
+ // Define rcode=12~15(UNASSIGNED) in rcode enum type.
+ // Some DNS Servers might return undefined code to devices.
+ // Without the enum definition, that would be noise for our dashboard.
+ NS_R_UNASSIGNED12 = 12; // Unassigned
+ NS_R_UNASSIGNED13 = 13; // Unassigned
+ NS_R_UNASSIGNED14 = 14; // Unassigned
+ NS_R_UNASSIGNED15 = 15; // Unassigned
// The following are EDNS extended rcodes
NS_R_BADVERS = 16;
// The following are TSIG errors
@@ -185,6 +192,8 @@
NT_BLUETOOTH_VPN = 10;
// Indicates this network uses an Ethernet+VPN transport.
NT_ETHERNET_VPN = 11;
+ // Indicates this network uses a Wi-Fi+Cellular+VPN transport.
+ NT_WIFI_CELLULAR_VPN = 12;
}
enum CacheStatus{
diff --git a/tests/dns_responder/Android.bp b/tests/dns_responder/Android.bp
index b67bcee..a7ef021 100644
--- a/tests/dns_responder/Android.bp
+++ b/tests/dns_responder/Android.bp
@@ -1,14 +1,19 @@
// TODO: Remove libnetd_test_dnsresponder after eliminating all users.
-cc_library_static {
+cc_test_library {
name: "libnetd_test_dnsresponder",
defaults: ["netd_defaults", "resolv_test_defaults"],
shared_libs: [
- "dnsresolver_aidl_interface-unstable-cpp",
"libbinder",
"libnetd_client",
+ ],
+ static_libs: [
+ "dnsresolver_aidl_interface-unstable-cpp",
+ "libcrypto_static",
"libnetdutils",
"libssl",
+ "libutils",
"netd_aidl_interface-cpp",
+ "netd_event_listener_interface-cpp",
],
srcs: [
"dns_responder.cpp",
@@ -18,7 +23,7 @@
export_include_dirs: ["."],
}
-cc_library {
+cc_test_library {
name: "libnetd_test_dnsresponder_ndk",
defaults: ["netd_defaults", "resolv_test_defaults"],
shared_libs: [
@@ -37,8 +42,8 @@
"libcrypto_static",
"libnetdutils",
"libssl",
- "netd_event_listener_interface-ndk_platform",
"netd_aidl_interface-ndk_platform",
+ "netd_event_listener_interface-ndk_platform",
],
srcs: [
"dns_responder.cpp",
diff --git a/tests/dnsresolver_binder_test.cpp b/tests/dnsresolver_binder_test.cpp
index 1c6527f..6fb73f3 100644
--- a/tests/dnsresolver_binder_test.cpp
+++ b/tests/dnsresolver_binder_test.cpp
@@ -24,6 +24,7 @@
#include <vector>
#include <aidl/android/net/IDnsResolver.h>
+#include <android-base/file.h>
#include <android-base/stringprintf.h>
#include <android-base/strings.h>
#include <android/binder_manager.h>
@@ -245,6 +246,37 @@
}
}
+TEST_F(DnsResolverBinderTest, SetResolverConfiguration_TransportTypes) {
+ using ::testing::HasSubstr;
+ auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
+ resolverParams.transportTypes = {IDnsResolver::TRANSPORT_WIFI, IDnsResolver::TRANSPORT_VPN};
+ ::ndk::ScopedAStatus status = mDnsResolver->setResolverConfiguration(resolverParams);
+ EXPECT_TRUE(status.isOk()) << status.getMessage();
+ // TODO: Find a way to fix a potential deadlock here if it's larger than pipe buffer
+ // size(65535).
+ android::base::unique_fd writeFd, readFd;
+ EXPECT_TRUE(Pipe(&readFd, &writeFd));
+ EXPECT_EQ(mDnsResolver->dump(writeFd.get(), nullptr, 0), 0);
+ writeFd.reset();
+ std::string str;
+ ASSERT_TRUE(ReadFdToString(readFd, &str)) << strerror(errno);
+ EXPECT_THAT(str, HasSubstr("WIFI_VPN"));
+}
+
+TEST_F(DnsResolverBinderTest, SetResolverConfiguration_TransportTypes_Default) {
+ using ::testing::HasSubstr;
+ auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
+ ::ndk::ScopedAStatus status = mDnsResolver->setResolverConfiguration(resolverParams);
+ EXPECT_TRUE(status.isOk()) << status.getMessage();
+ android::base::unique_fd writeFd, readFd;
+ EXPECT_TRUE(Pipe(&readFd, &writeFd));
+ EXPECT_EQ(mDnsResolver->dump(writeFd.get(), nullptr, 0), 0);
+ writeFd.reset();
+ std::string str;
+ ASSERT_TRUE(ReadFdToString(readFd, &str)) << strerror(errno);
+ EXPECT_THAT(str, HasSubstr("UNKNOWN"));
+}
+
TEST_F(DnsResolverBinderTest, GetResolverInfo) {
std::vector<std::string> servers = {"127.0.0.1", "127.0.0.2"};
std::vector<std::string> domains = {"example.com"};
diff --git a/tests/resolv_integration_test.cpp b/tests/resolv_integration_test.cpp
index 9dda0f1..270f040 100644
--- a/tests/resolv_integration_test.cpp
+++ b/tests/resolv_integration_test.cpp
@@ -1087,7 +1087,7 @@
test::DNSResponder dns;
StartDns(dns, {});
auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
- resolverParams.experimentalOptions.hosts = invalidCustHosts;
+ resolverParams.resolverOptions.hosts = invalidCustHosts;
ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
for (const auto& hostname : {hostnameNoip, hostnameInvalidip}) {
// The query won't get data from customized table because of invalid customized table
@@ -1162,7 +1162,7 @@
StartDns(dns, config.dnsserverHosts);
auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
- resolverParams.experimentalOptions.hosts = config.customizedHosts;
+ resolverParams.resolverOptions.hosts = config.customizedHosts;
ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
@@ -1198,7 +1198,7 @@
StartDns(dns, dnsSvHostV4V6);
auto resolverParams = DnsResponderClient::GetDefaultResolverParamsParcel();
- resolverParams.experimentalOptions.hosts = custHostV4V6;
+ resolverParams.resolverOptions.hosts = custHostV4V6;
ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
const addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM};
ScopedAddrinfo result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
@@ -1206,7 +1206,7 @@
EXPECT_THAT(ToStrings(result), testing::UnorderedElementsAreArray({custAddrV4, custAddrV6}));
EXPECT_EQ(0U, GetNumQueries(dns, hostnameV4V6));
- resolverParams.experimentalOptions.hosts = {};
+ resolverParams.resolverOptions.hosts = {};
ASSERT_TRUE(mDnsClient.resolvService()->setResolverConfiguration(resolverParams).isOk());
result = safe_getaddrinfo(hostnameV4V6, nullptr, &hints);
ASSERT_TRUE(result != nullptr);
@@ -4139,7 +4139,7 @@
ResolverParamsParcel parcel = DnsResponderClient::GetDefaultResolverParamsParcel();
parcel.servers = {listen_addr, listen_addr2};
if (config.tcMode) {
- parcel.experimentalOptions.tcMode = config.tcMode.value();
+ parcel.resolverOptions.tcMode = config.tcMode.value();
}
ASSERT_EQ(mDnsClient.resolvService()->setResolverConfiguration(parcel).isOk(), config.ret);