Make resolver timeout configurable via setResolverConfiguration()
This is infrastructure for tests simulating unresponsive nameservers.
With the default timeout of 5 seconds, with 4 retries per lookup, makes
this sort of tests impractical.
Change-Id: I2a2315507a4725744de6caa46121d83af13b59d1
Test: netd_unit_test --gtest_filter='ResolverTest.*'
diff --git a/server/CommandListener.cpp b/server/CommandListener.cpp
index e3c1743..9db017c 100644
--- a/server/CommandListener.cpp
+++ b/server/CommandListener.cpp
@@ -658,7 +658,7 @@
return false;
}
int end = argc;
- __res_params params;
+ __res_params params = {};
const __res_params* paramsPtr = nullptr;
if (end > 6 && !strcmp(argv[end - 2], "--params")) {
const char* paramsStr = argv[end - 1];
diff --git a/server/ResolverController.cpp b/server/ResolverController.cpp
index c6ac659..4eafcec 100644
--- a/server/ResolverController.cpp
+++ b/server/ResolverController.cpp
@@ -497,7 +497,10 @@
const std::vector<std::string>& tlsServers,
const std::set<std::vector<uint8_t>>& tlsFingerprints) {
using android::net::INetd;
- if (params.size() != INetd::RESOLVER_PARAMS_COUNT) {
+ // TODO: make RESOLVER_PARAMS_BASE_TIMEOUT_MSEC a mandatory parameter once all callers
+ // have been updated to specify it.
+ if (params.size() < INetd::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC ||
+ params.size() > INetd::RESOLVER_PARAMS_COUNT) {
ALOGE("%s: params.size()=%zu", __FUNCTION__, params.size());
return -EINVAL;
}
@@ -522,12 +525,14 @@
}
}
- __res_params res_params;
+ __res_params res_params = {};
res_params.sample_validity = params[INetd::RESOLVER_PARAMS_SAMPLE_VALIDITY];
res_params.success_threshold = params[INetd::RESOLVER_PARAMS_SUCCESS_THRESHOLD];
res_params.min_samples = params[INetd::RESOLVER_PARAMS_MIN_SAMPLES];
res_params.max_samples = params[INetd::RESOLVER_PARAMS_MAX_SAMPLES];
-
+ if (params.size() > INetd::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC) {
+ res_params.base_timeout_msec = params[INetd::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC];
+ }
return setDnsServers(netId, domains_str.c_str(), server_ptrs.data(), server_ptrs.size(),
&res_params);
}
@@ -552,6 +557,7 @@
(*params)[INetd::RESOLVER_PARAMS_SUCCESS_THRESHOLD] = res_params.success_threshold;
(*params)[INetd::RESOLVER_PARAMS_MIN_SAMPLES] = res_params.min_samples;
(*params)[INetd::RESOLVER_PARAMS_MAX_SAMPLES] = res_params.max_samples;
+ (*params)[INetd::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC] = res_params.base_timeout_msec;
return 0;
}
@@ -560,7 +566,7 @@
using android::net::ResolverStats;
std::vector<std::string> servers;
std::vector<std::string> domains;
- __res_params params;
+ __res_params params = {};
std::vector<ResolverStats> stats;
time_t now = time(nullptr);
int rv = getDnsInfo(netId, &servers, &domains, ¶ms, &stats);
@@ -599,11 +605,12 @@
dw.println("search domains: %s", domains_str.c_str());
}
if (params.sample_validity != 0) {
- dw.println("DNS parameters: sample validity = %us, success threshold = %u%%, "
- "samples (min, max) = (%u, %u)", params.sample_validity,
- static_cast<unsigned>(params.success_threshold),
+ dw.println(
+ "DNS parameters: sample validity = %us, success threshold = %u%%, "
+ "samples (min, max) = (%u, %u), base_timeout = %dmsec",
+ params.sample_validity, static_cast<unsigned>(params.success_threshold),
static_cast<unsigned>(params.min_samples),
- static_cast<unsigned>(params.max_samples));
+ static_cast<unsigned>(params.max_samples), params.base_timeout_msec);
}
sPrivateDnsConfiguration.dump(dw, netId);
diff --git a/server/binder/android/net/INetd.aidl b/server/binder/android/net/INetd.aidl
index 9401e92..4c857b1 100644
--- a/server/binder/android/net/INetd.aidl
+++ b/server/binder/android/net/INetd.aidl
@@ -182,7 +182,8 @@
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_COUNT = 4;
+ const int RESOLVER_PARAMS_BASE_TIMEOUT_MSEC = 4;
+ const int RESOLVER_PARAMS_COUNT = 5;
/**
* Sets the name servers, search domains and resolver params for the given network. Flushes the
diff --git a/tests/benchmarks/dns_benchmark.cpp b/tests/benchmarks/dns_benchmark.cpp
index f412176..7edd77a 100644
--- a/tests/benchmarks/dns_benchmark.cpp
+++ b/tests/benchmarks/dns_benchmark.cpp
@@ -97,7 +97,7 @@
dns.SetupDNSServers(MAXNS, mappings, &mDns, &servers);
- const std::vector<int> mDefaultParams_Binder = { 300, 25, 8, 8 };
+ const std::vector<int> mDefaultParams_Binder = {300, 25, 8, 8, 100};
dns.SetResolversForNetwork(servers, domains, mDefaultParams_Binder);
}
}
diff --git a/tests/netd_test.cpp b/tests/netd_test.cpp
index 5d09346..b586c45 100644
--- a/tests/netd_test.cpp
+++ b/tests/netd_test.cpp
@@ -173,7 +173,8 @@
.min_samples = static_cast<uint8_t>(
params32[INetd::RESOLVER_PARAMS_MIN_SAMPLES]),
.max_samples = static_cast<uint8_t>(
- params32[INetd::RESOLVER_PARAMS_MAX_SAMPLES])
+ params32[INetd::RESOLVER_PARAMS_MAX_SAMPLES]),
+ .base_timeout_msec = params32[INetd::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
};
return ResolverStats::decodeAll(stats32, stats);
}
@@ -271,7 +272,12 @@
const std::vector<std::string> mDefaultSearchDomains = { "example.com" };
// <sample validity in s> <success threshold in percent> <min samples> <max samples>
const std::string mDefaultParams = "300 25 8 8";
- const std::vector<int> mDefaultParams_Binder = { 300, 25, 8, 8 };
+ const std::vector<int> mDefaultParams_Binder = {
+ 300, // SAMPLE_VALIDITY
+ 25, // SUCCESS_THRESHOLD
+ 8, 8, // {MIN,MAX}_SAMPLES
+ 100, // BASE_TIMEOUT_MSEC
+ };
};
TEST_F(ResolverTest, GetHostByName) {
@@ -311,7 +317,8 @@
INetd::RESOLVER_PARAMS_SAMPLE_VALIDITY,
INetd::RESOLVER_PARAMS_SUCCESS_THRESHOLD,
INetd::RESOLVER_PARAMS_MIN_SAMPLES,
- INetd::RESOLVER_PARAMS_MAX_SAMPLES
+ INetd::RESOLVER_PARAMS_MAX_SAMPLES,
+ INetd::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC,
};
int size = static_cast<int>(params_offsets.size());
EXPECT_EQ(size, INetd::RESOLVER_PARAMS_COUNT);
@@ -362,6 +369,8 @@
res_params.success_threshold);
EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
+ EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
+ res_params.base_timeout_msec);
EXPECT_EQ(servers.size(), res_stats.size());
EXPECT_TRUE(UnorderedCompareArray(res_servers, servers));
@@ -676,6 +685,8 @@
res_params.success_threshold);
EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
+ EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
+ res_params.base_timeout_msec);
}
TEST_F(ResolverTest, SearchPathChange) {