blob: 287c2eb644a0c2d6855803f1725ee7b1a489b8f4 [file] [log] [blame]
Bernie Innocenti443489e2018-08-10 14:27:23 +09001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless requied by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 */
17
Bernie Innocentic165ce82018-10-16 23:35:28 +090018#define LOG_TAG "netd_test"
19
Bernie Innocenti443489e2018-08-10 14:27:23 +090020#include <arpa/inet.h>
Luke Huangc68f1b92018-11-21 20:13:38 +080021#include <arpa/nameser.h>
Bernie Innocenti443489e2018-08-10 14:27:23 +090022#include <netdb.h>
Luke Huangc68f1b92018-11-21 20:13:38 +080023#include <netinet/in.h>
24#include <poll.h> /* poll */
25#include <resolv.h>
Bernie Innocenti443489e2018-08-10 14:27:23 +090026#include <stdarg.h>
27#include <stdio.h>
28#include <stdlib.h>
Luke Huangc68f1b92018-11-21 20:13:38 +080029#include <sys/socket.h>
30#include <sys/un.h>
Bernie Innocenti443489e2018-08-10 14:27:23 +090031#include <unistd.h>
32
33#include <algorithm>
34#include <chrono>
35#include <iterator>
36#include <numeric>
37#include <thread>
38
Bernie Innocenti443489e2018-08-10 14:27:23 +090039#include <android-base/stringprintf.h>
Bernie Innocenti0298c682018-10-02 23:18:11 +090040#include <cutils/sockets.h>
Bernie Innocentic165ce82018-10-16 23:35:28 +090041#include <gtest/gtest.h>
Bernie Innocenti443489e2018-08-10 14:27:23 +090042#include <openssl/base64.h>
Bernie Innocentic165ce82018-10-16 23:35:28 +090043#include <private/android_filesystem_config.h>
44#include <utils/Log.h>
Bernie Innocenti443489e2018-08-10 14:27:23 +090045
Bernie Innocenti443489e2018-08-10 14:27:23 +090046#include "NetdClient.h"
Bernie Innocenti189eb502018-10-01 23:10:18 +090047#include "netid_client.h" // NETID_UNSET
Bernie Innocentic165ce82018-10-16 23:35:28 +090048#include "netd_resolv/params.h" // MAX_NS
Bernie Innocenti443489e2018-08-10 14:27:23 +090049
Ken Chenc68c2de2018-11-13 21:51:13 +080050#include "dns_responder/dns_responder.h"
51#include "dns_responder/dns_responder_client.h"
52#include "dns_responder/dns_tls_frontend.h"
Bernie Innocenti9bf749f2018-08-30 08:37:22 +090053
54#include "NetdConstants.h"
Bernie Innocenti443489e2018-08-10 14:27:23 +090055#include "ResolverStats.h"
56
57#include "android/net/INetd.h"
58#include "android/net/metrics/INetdEventListener.h"
59#include "binder/IServiceManager.h"
60#include "netdutils/SocketOption.h"
61
Bernie Innocentic165ce82018-10-16 23:35:28 +090062// TODO: make this dynamic and stop depending on implementation details.
Luke Huangc68f1b92018-11-21 20:13:38 +080063constexpr int TEST_NETID = 30;
64constexpr int MAXPACKET = (8 * 1024);
Bernie Innocentic165ce82018-10-16 23:35:28 +090065
66// Semi-public Bionic hook used by the NDK (frameworks/base/native/android/net.c)
67// Tested here for convenience.
68extern "C" int android_getaddrinfofornet(const char* hostname, const char* servname,
69 const addrinfo* hints, unsigned netid, unsigned mark,
70 struct addrinfo** result);
71
Bernie Innocenti443489e2018-08-10 14:27:23 +090072using android::base::StringPrintf;
73using android::net::ResolverStats;
74using android::net::metrics::INetdEventListener;
75using android::netdutils::enableSockopt;
76
Bernie Innocenti9bf749f2018-08-30 08:37:22 +090077// TODO: move into libnetdutils?
78namespace {
79ScopedAddrinfo safe_getaddrinfo(const char* node, const char* service,
80 const struct addrinfo* hints) {
81 addrinfo* result = nullptr;
82 if (getaddrinfo(node, service, hints, &result) != 0) {
83 result = nullptr; // Should already be the case, but...
84 }
85 return ScopedAddrinfo(result);
86}
87} // namespace
88
Bernie Innocenti443489e2018-08-10 14:27:23 +090089// Emulates the behavior of UnorderedElementsAreArray, which currently cannot be used.
90// TODO: Use UnorderedElementsAreArray, which depends on being able to compile libgmock_host,
91// if that is not possible, improve this hacky algorithm, which is O(n**2)
92template <class A, class B>
93bool UnorderedCompareArray(const A& a, const B& b) {
94 if (a.size() != b.size()) return false;
95 for (const auto& a_elem : a) {
96 size_t a_count = 0;
97 for (const auto& a_elem2 : a) {
98 if (a_elem == a_elem2) {
99 ++a_count;
100 }
101 }
102 size_t b_count = 0;
103 for (const auto& b_elem : b) {
104 if (a_elem == b_elem) ++b_count;
105 }
106 if (a_count != b_count) return false;
107 }
108 return true;
109}
110
Bernie Innocenti443489e2018-08-10 14:27:23 +0900111class ResolverTest : public ::testing::Test, public DnsResponderClient {
Bernie Innocenti0298c682018-10-02 23:18:11 +0900112 protected:
113 void SetUp() {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900114 // Ensure resolutions go via proxy.
115 DnsResponderClient::SetUp();
116
117 // If DNS reporting is off: turn it on so we run through everything.
118 auto rv = mNetdSrv->getMetricsReportingLevel(&mOriginalMetricsLevel);
119 ASSERT_TRUE(rv.isOk());
120 if (mOriginalMetricsLevel != INetdEventListener::REPORTING_LEVEL_FULL) {
121 rv = mNetdSrv->setMetricsReportingLevel(INetdEventListener::REPORTING_LEVEL_FULL);
122 ASSERT_TRUE(rv.isOk());
123 }
124 }
125
Bernie Innocenti0298c682018-10-02 23:18:11 +0900126 void TearDown() {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900127 if (mOriginalMetricsLevel != INetdEventListener::REPORTING_LEVEL_FULL) {
128 auto rv = mNetdSrv->setMetricsReportingLevel(mOriginalMetricsLevel);
129 ASSERT_TRUE(rv.isOk());
130 }
131
132 DnsResponderClient::TearDown();
133 }
134
135 bool GetResolverInfo(std::vector<std::string>* servers, std::vector<std::string>* domains,
Mike Yuda77e8e2018-11-26 13:26:21 +0900136 std::vector<std::string>* tlsServers, __res_params* params,
137 std::vector<ResolverStats>* stats) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900138 using android::net::INetd;
139 std::vector<int32_t> params32;
140 std::vector<int32_t> stats32;
Mike Yuda77e8e2018-11-26 13:26:21 +0900141 auto rv = mNetdSrv->getResolverInfo(TEST_NETID, servers, domains, tlsServers, &params32,
142 &stats32);
Bernie Innocenti45238a12018-12-04 14:57:48 +0900143 if (!rv.isOk() || params32.size() != static_cast<size_t>(INetd::RESOLVER_PARAMS_COUNT)) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900144 return false;
145 }
146 *params = __res_params {
147 .sample_validity = static_cast<uint16_t>(
148 params32[INetd::RESOLVER_PARAMS_SAMPLE_VALIDITY]),
149 .success_threshold = static_cast<uint8_t>(
150 params32[INetd::RESOLVER_PARAMS_SUCCESS_THRESHOLD]),
151 .min_samples = static_cast<uint8_t>(
152 params32[INetd::RESOLVER_PARAMS_MIN_SAMPLES]),
153 .max_samples = static_cast<uint8_t>(
154 params32[INetd::RESOLVER_PARAMS_MAX_SAMPLES]),
155 .base_timeout_msec = params32[INetd::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
156 };
157 return ResolverStats::decodeAll(stats32, stats);
158 }
159
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900160 static std::string ToString(const hostent* he) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900161 if (he == nullptr) return "<null>";
162 char buffer[INET6_ADDRSTRLEN];
163 if (!inet_ntop(he->h_addrtype, he->h_addr_list[0], buffer, sizeof(buffer))) {
164 return "<invalid>";
165 }
166 return buffer;
167 }
168
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900169 static std::string ToString(const addrinfo* ai) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900170 if (!ai)
171 return "<null>";
172 for (const auto* aip = ai ; aip != nullptr ; aip = aip->ai_next) {
173 char host[NI_MAXHOST];
174 int rv = getnameinfo(aip->ai_addr, aip->ai_addrlen, host, sizeof(host), nullptr, 0,
175 NI_NUMERICHOST);
176 if (rv != 0)
177 return gai_strerror(rv);
178 return host;
179 }
180 return "<invalid>";
181 }
182
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900183 static std::string ToString(const ScopedAddrinfo& ai) { return ToString(ai.get()); }
184
nuccachenf52f7a52018-07-17 18:07:23 +0800185 static std::vector<std::string> ToStrings(const addrinfo* ai) {
186 std::vector<std::string> hosts;
187 if (!ai) {
188 hosts.push_back("<null>");
189 return hosts;
190 }
191 for (const auto* aip = ai; aip != nullptr; aip = aip->ai_next) {
192 char host[NI_MAXHOST];
193 int rv = getnameinfo(aip->ai_addr, aip->ai_addrlen, host, sizeof(host), nullptr, 0,
194 NI_NUMERICHOST);
195 if (rv != 0) {
196 hosts.clear();
197 hosts.push_back(gai_strerror(rv));
198 return hosts;
199 } else {
200 hosts.push_back(host);
201 }
202 }
203 if (hosts.empty()) hosts.push_back("<invalid>");
204 return hosts;
205 }
206
207 static std::vector<std::string> ToStrings(const ScopedAddrinfo& ai) {
208 return ToStrings(ai.get());
209 }
210
Bernie Innocenti443489e2018-08-10 14:27:23 +0900211 size_t GetNumQueries(const test::DNSResponder& dns, const char* name) const {
212 auto queries = dns.queries();
213 size_t found = 0;
214 for (const auto& p : queries) {
215 if (p.first == name) {
216 ++found;
217 }
218 }
219 return found;
220 }
221
222 size_t GetNumQueriesForType(const test::DNSResponder& dns, ns_type type,
Bernie Innocenti0298c682018-10-02 23:18:11 +0900223 const char* name) const {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900224 auto queries = dns.queries();
225 size_t found = 0;
226 for (const auto& p : queries) {
227 if (p.second == type && p.first == name) {
228 ++found;
229 }
230 }
231 return found;
232 }
233
nuccachenf52f7a52018-07-17 18:07:23 +0800234 bool WaitForPrefix64Detected(int netId, int timeoutMs) {
235 constexpr int intervalMs = 2;
236 const int limit = timeoutMs / intervalMs;
237 for (int count = 0; count <= limit; ++count) {
238 std::string prefix;
239 auto rv = mNetdSrv->getPrefix64(netId, &prefix);
240 if (rv.isOk()) {
241 return true;
242 }
243 usleep(intervalMs * 1000);
244 }
245 return false;
246 }
247
Bernie Innocenti443489e2018-08-10 14:27:23 +0900248 void RunGetAddrInfoStressTest_Binder(unsigned num_hosts, unsigned num_threads,
249 unsigned num_queries) {
250 std::vector<std::string> domains = { "example.com" };
251 std::vector<std::unique_ptr<test::DNSResponder>> dns;
252 std::vector<std::string> servers;
253 std::vector<DnsResponderClient::Mapping> mappings;
254 ASSERT_NO_FATAL_FAILURE(SetupMappings(num_hosts, domains, &mappings));
255 ASSERT_NO_FATAL_FAILURE(SetupDNSServers(MAXNS, mappings, &dns, &servers));
256
257 ASSERT_TRUE(SetResolversForNetwork(servers, domains, mDefaultParams_Binder));
258
259 auto t0 = std::chrono::steady_clock::now();
260 std::vector<std::thread> threads(num_threads);
261 for (std::thread& thread : threads) {
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900262 thread = std::thread([&mappings, num_queries]() {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900263 for (unsigned i = 0 ; i < num_queries ; ++i) {
264 uint32_t ofs = arc4random_uniform(mappings.size());
265 auto& mapping = mappings[ofs];
266 addrinfo* result = nullptr;
267 int rv = getaddrinfo(mapping.host.c_str(), nullptr, nullptr, &result);
268 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
269 if (rv == 0) {
270 std::string result_str = ToString(result);
271 EXPECT_TRUE(result_str == mapping.ip4 || result_str == mapping.ip6)
272 << "result='" << result_str << "', ip4='" << mapping.ip4
273 << "', ip6='" << mapping.ip6;
274 }
275 if (result) {
276 freeaddrinfo(result);
277 result = nullptr;
278 }
279 }
280 });
281 }
282
283 for (std::thread& thread : threads) {
284 thread.join();
285 }
286 auto t1 = std::chrono::steady_clock::now();
287 ALOGI("%u hosts, %u threads, %u queries, %Es", num_hosts, num_threads, num_queries,
288 std::chrono::duration<double>(t1 - t0).count());
289 ASSERT_NO_FATAL_FAILURE(ShutdownDNSServers(&dns));
290 }
291
292 const std::vector<std::string> mDefaultSearchDomains = { "example.com" };
293 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
294 const std::vector<int> mDefaultParams_Binder = {
295 300, // SAMPLE_VALIDITY
296 25, // SUCCESS_THRESHOLD
297 8, 8, // {MIN,MAX}_SAMPLES
298 100, // BASE_TIMEOUT_MSEC
299 };
Bernie Innocenti0298c682018-10-02 23:18:11 +0900300
301 private:
302 int mOriginalMetricsLevel;
Bernie Innocenti443489e2018-08-10 14:27:23 +0900303};
304
305TEST_F(ResolverTest, GetHostByName) {
306 const char* listen_addr = "127.0.0.3";
307 const char* listen_srv = "53";
308 const char* host_name = "hello.example.com.";
309 const char *nonexistent_host_name = "nonexistent.example.com.";
310 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
311 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.3");
312 ASSERT_TRUE(dns.startServer());
313 std::vector<std::string> servers = { listen_addr };
314 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
315
316 const hostent* result;
317
318 dns.clearQueries();
319 result = gethostbyname("nonexistent");
320 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, nonexistent_host_name));
321 ASSERT_TRUE(result == nullptr);
322 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
323
324 dns.clearQueries();
325 result = gethostbyname("hello");
326 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
327 ASSERT_FALSE(result == nullptr);
328 ASSERT_EQ(4, result->h_length);
329 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
330 EXPECT_EQ("1.2.3.3", ToString(result));
331 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
332
333 dns.stopServer();
334}
335
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900336TEST_F(ResolverTest, GetHostByName_localhost) {
337 constexpr char name[] = "localhost";
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900338 constexpr char name_camelcase[] = "LocalHost";
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900339 constexpr char addr[] = "127.0.0.1";
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900340 constexpr char name_ip6[] = "ip6-localhost";
341 constexpr char addr_ip6[] = "::1";
Bernie Innocenti0298c682018-10-02 23:18:11 +0900342 constexpr char name_ip6_dot[] = "ip6-localhost.";
343 constexpr char name_ip6_fqdn[] = "ip6-localhost.example.com.";
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900344
Bernie Innocenti974233e2018-09-04 20:35:34 +0900345 // Add a dummy nameserver which shouldn't receive any queries
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900346 constexpr char listen_addr[] = "127.0.0.3";
347 constexpr char listen_srv[] = "53";
348 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
349 ASSERT_TRUE(dns.startServer());
350 std::vector<std::string> servers = {listen_addr};
351 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900352 dns.clearQueries();
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900353
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900354 // Expect no DNS queries; localhost is resolved via /etc/hosts
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900355 const hostent* result = gethostbyname(name);
Bernie Innocenti0298c682018-10-02 23:18:11 +0900356 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900357 ASSERT_FALSE(result == nullptr);
358 ASSERT_EQ(4, result->h_length);
359 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
360 EXPECT_EQ(addr, ToString(result));
361 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
362
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900363 // Ensure the hosts file resolver ignores case of hostnames
364 result = gethostbyname(name_camelcase);
Bernie Innocenti0298c682018-10-02 23:18:11 +0900365 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900366 ASSERT_FALSE(result == nullptr);
367 ASSERT_EQ(4, result->h_length);
368 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
369 EXPECT_EQ(addr, ToString(result));
370 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
371
372 // The hosts file also contains ip6-localhost, but gethostbyname() won't
Bernie Innocenti0298c682018-10-02 23:18:11 +0900373 // return it unless the RES_USE_INET6 option is set. This would be easy to
374 // change, but there's no point in changing the legacy behavior; new code
375 // should be calling getaddrinfo() anyway.
376 // So we check the legacy behavior, which results in amusing A-record
377 // lookups for ip6-localhost, with and without search domains appended.
378 dns.clearQueries();
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900379 result = gethostbyname(name_ip6);
Sehee Park8659b8d2018-11-16 10:53:16 +0900380 EXPECT_EQ(2U, dns.queries().size()) << dns.dumpQueries();
381 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_dot)) << dns.dumpQueries();
382 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, name_ip6_fqdn)) << dns.dumpQueries();
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900383 ASSERT_TRUE(result == nullptr);
384
Bernie Innocenti0298c682018-10-02 23:18:11 +0900385 // Finally, use gethostbyname2() to resolve ip6-localhost to ::1 from
386 // the hosts file.
387 dns.clearQueries();
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900388 result = gethostbyname2(name_ip6, AF_INET6);
Bernie Innocenti0298c682018-10-02 23:18:11 +0900389 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Bernie Innocenti6118bf82018-09-14 15:21:19 +0900390 ASSERT_FALSE(result == nullptr);
391 ASSERT_EQ(16, result->h_length);
392 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
393 EXPECT_EQ(addr_ip6, ToString(result));
394 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
395
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900396 dns.stopServer();
397}
398
Bernie Innocentic1545232018-10-04 17:12:24 +0900399TEST_F(ResolverTest, GetHostByName_numeric) {
400 // Add a dummy nameserver which shouldn't receive any queries
401 constexpr char listen_addr[] = "127.0.0.3";
402 constexpr char listen_srv[] = "53";
403 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
404 ASSERT_TRUE(dns.startServer());
405 ASSERT_TRUE(
406 SetResolversForNetwork({listen_addr}, mDefaultSearchDomains, mDefaultParams_Binder));
407
408 // Numeric v4 address: expect no DNS queries
409 constexpr char numeric_v4[] = "192.168.0.1";
410 dns.clearQueries();
411 const hostent* result = gethostbyname(numeric_v4);
Sehee Park8659b8d2018-11-16 10:53:16 +0900412 EXPECT_EQ(0U, dns.queries().size());
Bernie Innocentic1545232018-10-04 17:12:24 +0900413 ASSERT_FALSE(result == nullptr);
414 ASSERT_EQ(4, result->h_length); // v4
415 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
416 EXPECT_EQ(numeric_v4, ToString(result));
417 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
418
419 // gethostbyname() recognizes a v6 address, and fails with no DNS queries
420 constexpr char numeric_v6[] = "2001:db8::42";
421 dns.clearQueries();
422 result = gethostbyname(numeric_v6);
Sehee Park8659b8d2018-11-16 10:53:16 +0900423 EXPECT_EQ(0U, dns.queries().size());
Bernie Innocentic1545232018-10-04 17:12:24 +0900424 EXPECT_TRUE(result == nullptr);
425
426 // Numeric v6 address with gethostbyname2(): succeeds with no DNS queries
427 dns.clearQueries();
428 result = gethostbyname2(numeric_v6, AF_INET6);
Sehee Park8659b8d2018-11-16 10:53:16 +0900429 EXPECT_EQ(0U, dns.queries().size());
Bernie Innocentic1545232018-10-04 17:12:24 +0900430 ASSERT_FALSE(result == nullptr);
431 ASSERT_EQ(16, result->h_length); // v6
432 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
433 EXPECT_EQ(numeric_v6, ToString(result));
434 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
435
436 // Numeric v6 address with scope work with getaddrinfo(),
437 // but gethostbyname2() does not understand them; it issues two dns
438 // queries, then fails. This hardly ever happens, there's no point
439 // in fixing this. This test simply verifies the current (bogus)
440 // behavior to avoid further regressions (like crashes, or leaks).
441 constexpr char numeric_v6_scope[] = "fe80::1%lo";
442 dns.clearQueries();
443 result = gethostbyname2(numeric_v6_scope, AF_INET6);
Sehee Park8659b8d2018-11-16 10:53:16 +0900444 EXPECT_EQ(2U, dns.queries().size()); // OUCH!
Bernie Innocentic1545232018-10-04 17:12:24 +0900445 ASSERT_TRUE(result == nullptr);
446
447 dns.stopServer();
448}
449
Bernie Innocenti443489e2018-08-10 14:27:23 +0900450TEST_F(ResolverTest, BinderSerialization) {
451 using android::net::INetd;
452 std::vector<int> params_offsets = {
453 INetd::RESOLVER_PARAMS_SAMPLE_VALIDITY,
454 INetd::RESOLVER_PARAMS_SUCCESS_THRESHOLD,
455 INetd::RESOLVER_PARAMS_MIN_SAMPLES,
456 INetd::RESOLVER_PARAMS_MAX_SAMPLES,
457 INetd::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC,
458 };
Bernie Innocenti45238a12018-12-04 14:57:48 +0900459 const int size = static_cast<int>(params_offsets.size());
Bernie Innocenti443489e2018-08-10 14:27:23 +0900460 EXPECT_EQ(size, INetd::RESOLVER_PARAMS_COUNT);
461 std::sort(params_offsets.begin(), params_offsets.end());
Bernie Innocenti45238a12018-12-04 14:57:48 +0900462 for (int i = 0; i < size; ++i) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900463 EXPECT_EQ(params_offsets[i], i);
464 }
465}
466
467TEST_F(ResolverTest, GetHostByName_Binder) {
468 using android::net::INetd;
469
470 std::vector<std::string> domains = { "example.com" };
471 std::vector<std::unique_ptr<test::DNSResponder>> dns;
472 std::vector<std::string> servers;
473 std::vector<Mapping> mappings;
474 ASSERT_NO_FATAL_FAILURE(SetupMappings(1, domains, &mappings));
475 ASSERT_NO_FATAL_FAILURE(SetupDNSServers(4, mappings, &dns, &servers));
476 ASSERT_EQ(1U, mappings.size());
477 const Mapping& mapping = mappings[0];
478
479 ASSERT_TRUE(SetResolversForNetwork(servers, domains, mDefaultParams_Binder));
480
481 const hostent* result = gethostbyname(mapping.host.c_str());
Bernie Innocenti45238a12018-12-04 14:57:48 +0900482 const size_t total_queries =
483 std::accumulate(dns.begin(), dns.end(), 0, [this, &mapping](size_t total, auto& d) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900484 return total + GetNumQueriesForType(*d, ns_type::ns_t_a, mapping.entry.c_str());
485 });
486
487 EXPECT_LE(1U, total_queries);
488 ASSERT_FALSE(result == nullptr);
489 ASSERT_EQ(4, result->h_length);
490 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
491 EXPECT_EQ(mapping.ip4, ToString(result));
492 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
493
494 std::vector<std::string> res_servers;
495 std::vector<std::string> res_domains;
Mike Yuda77e8e2018-11-26 13:26:21 +0900496 std::vector<std::string> res_tls_servers;
Bernie Innocenti443489e2018-08-10 14:27:23 +0900497 __res_params res_params;
498 std::vector<ResolverStats> res_stats;
Mike Yuda77e8e2018-11-26 13:26:21 +0900499 ASSERT_TRUE(
500 GetResolverInfo(&res_servers, &res_domains, &res_tls_servers, &res_params, &res_stats));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900501 EXPECT_EQ(servers.size(), res_servers.size());
502 EXPECT_EQ(domains.size(), res_domains.size());
Mike Yuda77e8e2018-11-26 13:26:21 +0900503 EXPECT_EQ(0U, res_tls_servers.size());
Sehee Park8659b8d2018-11-16 10:53:16 +0900504 ASSERT_EQ(static_cast<size_t>(INetd::RESOLVER_PARAMS_COUNT), mDefaultParams_Binder.size());
Bernie Innocenti443489e2018-08-10 14:27:23 +0900505 EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_SAMPLE_VALIDITY],
506 res_params.sample_validity);
507 EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
508 res_params.success_threshold);
509 EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
510 EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
511 EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
512 res_params.base_timeout_msec);
513 EXPECT_EQ(servers.size(), res_stats.size());
514
515 EXPECT_TRUE(UnorderedCompareArray(res_servers, servers));
516 EXPECT_TRUE(UnorderedCompareArray(res_domains, domains));
517
518 ASSERT_NO_FATAL_FAILURE(ShutdownDNSServers(&dns));
519}
520
521TEST_F(ResolverTest, GetAddrInfo) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900522 const char* listen_addr = "127.0.0.4";
523 const char* listen_addr2 = "127.0.0.5";
524 const char* listen_srv = "53";
525 const char* host_name = "howdy.example.com.";
526 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
527 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
528 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
529 ASSERT_TRUE(dns.startServer());
530
531 test::DNSResponder dns2(listen_addr2, listen_srv, 250, ns_rcode::ns_r_servfail);
532 dns2.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
533 dns2.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
534 ASSERT_TRUE(dns2.startServer());
535
Bernie Innocenti443489e2018-08-10 14:27:23 +0900536 std::vector<std::string> servers = { listen_addr };
537 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
538 dns.clearQueries();
539 dns2.clearQueries();
540
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900541 ScopedAddrinfo result = safe_getaddrinfo("howdy", nullptr, nullptr);
542 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900543 size_t found = GetNumQueries(dns, host_name);
544 EXPECT_LE(1U, found);
545 // Could be A or AAAA
546 std::string result_str = ToString(result);
547 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
548 << ", result_str='" << result_str << "'";
Bernie Innocenti443489e2018-08-10 14:27:23 +0900549
550 // Verify that the name is cached.
551 size_t old_found = found;
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900552 result = safe_getaddrinfo("howdy", nullptr, nullptr);
553 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900554 found = GetNumQueries(dns, host_name);
555 EXPECT_LE(1U, found);
556 EXPECT_EQ(old_found, found);
557 result_str = ToString(result);
558 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
559 << result_str;
Bernie Innocenti443489e2018-08-10 14:27:23 +0900560
561 // Change the DNS resolver, ensure that queries are still cached.
562 servers = { listen_addr2 };
563 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
564 dns.clearQueries();
565 dns2.clearQueries();
566
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900567 result = safe_getaddrinfo("howdy", nullptr, nullptr);
568 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900569 found = GetNumQueries(dns, host_name);
570 size_t found2 = GetNumQueries(dns2, host_name);
571 EXPECT_EQ(0U, found);
572 EXPECT_LE(0U, found2);
573
574 // Could be A or AAAA
575 result_str = ToString(result);
576 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
577 << ", result_str='" << result_str << "'";
Bernie Innocenti443489e2018-08-10 14:27:23 +0900578
579 dns.stopServer();
580 dns2.stopServer();
581}
582
583TEST_F(ResolverTest, GetAddrInfoV4) {
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900584 constexpr char listen_addr[] = "127.0.0.5";
585 constexpr char listen_srv[] = "53";
586 constexpr char host_name[] = "hola.example.com.";
Bernie Innocenti443489e2018-08-10 14:27:23 +0900587 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
588 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.5");
589 ASSERT_TRUE(dns.startServer());
590 std::vector<std::string> servers = { listen_addr };
591 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
592
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900593 addrinfo hints = {.ai_family = AF_INET};
594 ScopedAddrinfo result = safe_getaddrinfo("hola", nullptr, &hints);
595 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900596 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
597 EXPECT_EQ("1.2.3.5", ToString(result));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900598}
599
600TEST_F(ResolverTest, GetAddrInfo_localhost) {
601 constexpr char name[] = "localhost";
602 constexpr char addr[] = "127.0.0.1";
603 constexpr char name_ip6[] = "ip6-localhost";
604 constexpr char addr_ip6[] = "::1";
605
Bernie Innocenti974233e2018-09-04 20:35:34 +0900606 // Add a dummy nameserver which shouldn't receive any queries
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900607 constexpr char listen_addr[] = "127.0.0.5";
608 constexpr char listen_srv[] = "53";
609 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
610 ASSERT_TRUE(dns.startServer());
611 std::vector<std::string> servers = {listen_addr};
612 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
613
614 ScopedAddrinfo result = safe_getaddrinfo(name, nullptr, nullptr);
615 EXPECT_TRUE(result != nullptr);
616 // Expect no DNS queries; localhost is resolved via /etc/hosts
Bernie Innocenti0298c682018-10-02 23:18:11 +0900617 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900618 EXPECT_EQ(addr, ToString(result));
619
620 result = safe_getaddrinfo(name_ip6, nullptr, nullptr);
621 EXPECT_TRUE(result != nullptr);
Bernie Innocenti0298c682018-10-02 23:18:11 +0900622 // Expect no DNS queries; ip6-localhost is resolved via /etc/hosts
623 EXPECT_TRUE(dns.queries().empty()) << dns.dumpQueries();
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900624 EXPECT_EQ(addr_ip6, ToString(result));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900625}
626
Bernie Innocenti443489e2018-08-10 14:27:23 +0900627TEST_F(ResolverTest, MultidomainResolution) {
628 std::vector<std::string> searchDomains = { "example1.com", "example2.com", "example3.com" };
629 const char* listen_addr = "127.0.0.6";
630 const char* listen_srv = "53";
631 const char* host_name = "nihao.example2.com.";
632 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
633 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.3");
634 ASSERT_TRUE(dns.startServer());
635 std::vector<std::string> servers = { listen_addr };
636 ASSERT_TRUE(SetResolversForNetwork(servers, searchDomains, mDefaultParams_Binder));
637
638 dns.clearQueries();
639 const hostent* result = gethostbyname("nihao");
640 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
641 ASSERT_FALSE(result == nullptr);
642 ASSERT_EQ(4, result->h_length);
643 ASSERT_FALSE(result->h_addr_list[0] == nullptr);
644 EXPECT_EQ("1.2.3.3", ToString(result));
645 EXPECT_TRUE(result->h_addr_list[1] == nullptr);
646 dns.stopServer();
647}
648
Bernie Innocenti974233e2018-09-04 20:35:34 +0900649TEST_F(ResolverTest, GetAddrInfoV6_numeric) {
650 constexpr char listen_addr0[] = "127.0.0.7";
651 constexpr char listen_srv[] = "53";
652 constexpr char host_name[] = "ohayou.example.com.";
653 constexpr char numeric_addr[] = "fe80::1%lo";
654
655 test::DNSResponder dns(listen_addr0, listen_srv, 250, ns_rcode::ns_r_servfail);
656 dns.setResponseProbability(0.0);
657 dns.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::5");
658 ASSERT_TRUE(dns.startServer());
659 std::vector<std::string> servers = {listen_addr0};
660 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
661
662 addrinfo hints = {.ai_family = AF_INET6};
663 ScopedAddrinfo result = safe_getaddrinfo(numeric_addr, nullptr, &hints);
664 EXPECT_TRUE(result != nullptr);
665 EXPECT_EQ(numeric_addr, ToString(result));
666 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
667
668 // Now try a non-numeric hostname query with the AI_NUMERICHOST flag set.
669 // We should fail without sending out a DNS query.
670 hints.ai_flags |= AI_NUMERICHOST;
671 result = safe_getaddrinfo(host_name, nullptr, &hints);
672 EXPECT_TRUE(result == nullptr);
673 EXPECT_TRUE(dns.queries().empty()); // Ensure no DNS queries were sent out
674}
675
Bernie Innocenti443489e2018-08-10 14:27:23 +0900676TEST_F(ResolverTest, GetAddrInfoV6_failing) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900677 const char* listen_addr0 = "127.0.0.7";
678 const char* listen_addr1 = "127.0.0.8";
679 const char* listen_srv = "53";
680 const char* host_name = "ohayou.example.com.";
681 test::DNSResponder dns0(listen_addr0, listen_srv, 250, ns_rcode::ns_r_servfail);
682 test::DNSResponder dns1(listen_addr1, listen_srv, 250, ns_rcode::ns_r_servfail);
683 dns0.setResponseProbability(0.0);
684 dns0.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::5");
685 dns1.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::6");
686 ASSERT_TRUE(dns0.startServer());
687 ASSERT_TRUE(dns1.startServer());
688 std::vector<std::string> servers = { listen_addr0, listen_addr1 };
689 // <sample validity in s> <success threshold in percent> <min samples> <max samples>
690 int sample_count = 8;
691 const std::vector<int> params = { 300, 25, sample_count, sample_count };
692 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, params));
693
694 // Repeatedly perform resolutions for non-existing domains until MAXNSSAMPLES resolutions have
695 // reached the dns0, which is set to fail. No more requests should then arrive at that server
696 // for the next sample_lifetime seconds.
697 // TODO: This approach is implementation-dependent, change once metrics reporting is available.
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900698 addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocenti45238a12018-12-04 14:57:48 +0900699 for (int i = 0; i < sample_count; ++i) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900700 std::string domain = StringPrintf("nonexistent%d", i);
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900701 ScopedAddrinfo result = safe_getaddrinfo(domain.c_str(), nullptr, &hints);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900702 }
703 // Due to 100% errors for all possible samples, the server should be ignored from now on and
704 // only the second one used for all following queries, until NSSAMPLE_VALIDITY is reached.
705 dns0.clearQueries();
706 dns1.clearQueries();
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900707 ScopedAddrinfo result = safe_getaddrinfo("ohayou", nullptr, &hints);
708 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900709 EXPECT_EQ(0U, GetNumQueries(dns0, host_name));
710 EXPECT_EQ(1U, GetNumQueries(dns1, host_name));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900711}
712
713TEST_F(ResolverTest, GetAddrInfoV6_nonresponsive) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900714 const char* listen_addr0 = "127.0.0.7";
715 const char* listen_addr1 = "127.0.0.8";
716 const char* listen_srv = "53";
717 const char* host_name1 = "ohayou.example.com.";
718 const char* host_name2 = "ciao.example.com.";
719
720 // dns0 does not respond with 100% probability, while
721 // dns1 responds normally, at least initially.
722 test::DNSResponder dns0(listen_addr0, listen_srv, 250, static_cast<ns_rcode>(-1));
723 test::DNSResponder dns1(listen_addr1, listen_srv, 250, static_cast<ns_rcode>(-1));
724 dns0.setResponseProbability(0.0);
725 dns0.addMapping(host_name1, ns_type::ns_t_aaaa, "2001:db8::5");
726 dns1.addMapping(host_name1, ns_type::ns_t_aaaa, "2001:db8::6");
727 dns0.addMapping(host_name2, ns_type::ns_t_aaaa, "2001:db8::5");
728 dns1.addMapping(host_name2, ns_type::ns_t_aaaa, "2001:db8::6");
729 ASSERT_TRUE(dns0.startServer());
730 ASSERT_TRUE(dns1.startServer());
731 std::vector<std::string> servers = {listen_addr0, listen_addr1};
732 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
733
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900734 const addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocenti443489e2018-08-10 14:27:23 +0900735
736 // dns0 will ignore the request, and we'll fallback to dns1 after the first
737 // retry.
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900738 ScopedAddrinfo result = safe_getaddrinfo(host_name1, nullptr, &hints);
739 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900740 EXPECT_EQ(1U, GetNumQueries(dns0, host_name1));
741 EXPECT_EQ(1U, GetNumQueries(dns1, host_name1));
742
743 // Now make dns1 also ignore 100% requests... The resolve should alternate
744 // retries between the nameservers and fail after 4 attempts.
745 dns1.setResponseProbability(0.0);
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900746 addrinfo* result2 = nullptr;
747 EXPECT_EQ(EAI_NODATA, getaddrinfo(host_name2, nullptr, &hints, &result2));
748 EXPECT_EQ(nullptr, result2);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900749 EXPECT_EQ(4U, GetNumQueries(dns0, host_name2));
750 EXPECT_EQ(4U, GetNumQueries(dns1, host_name2));
751}
752
753TEST_F(ResolverTest, GetAddrInfoV6_concurrent) {
754 const char* listen_addr0 = "127.0.0.9";
755 const char* listen_addr1 = "127.0.0.10";
756 const char* listen_addr2 = "127.0.0.11";
757 const char* listen_srv = "53";
758 const char* host_name = "konbanha.example.com.";
759 test::DNSResponder dns0(listen_addr0, listen_srv, 250, ns_rcode::ns_r_servfail);
760 test::DNSResponder dns1(listen_addr1, listen_srv, 250, ns_rcode::ns_r_servfail);
761 test::DNSResponder dns2(listen_addr2, listen_srv, 250, ns_rcode::ns_r_servfail);
762 dns0.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::5");
763 dns1.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::6");
764 dns2.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::7");
765 ASSERT_TRUE(dns0.startServer());
766 ASSERT_TRUE(dns1.startServer());
767 ASSERT_TRUE(dns2.startServer());
768 const std::vector<std::string> servers = { listen_addr0, listen_addr1, listen_addr2 };
769 std::vector<std::thread> threads(10);
770 for (std::thread& thread : threads) {
771 thread = std::thread([this, &servers]() {
772 unsigned delay = arc4random_uniform(1*1000*1000); // <= 1s
773 usleep(delay);
774 std::vector<std::string> serverSubset;
775 for (const auto& server : servers) {
776 if (arc4random_uniform(2)) {
777 serverSubset.push_back(server);
778 }
779 }
780 if (serverSubset.empty()) serverSubset = servers;
781 ASSERT_TRUE(SetResolversForNetwork(serverSubset, mDefaultSearchDomains,
782 mDefaultParams_Binder));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900783 addrinfo hints = {.ai_family = AF_INET6};
Bernie Innocenti443489e2018-08-10 14:27:23 +0900784 addrinfo* result = nullptr;
785 int rv = getaddrinfo("konbanha", nullptr, &hints, &result);
786 EXPECT_EQ(0, rv) << "error [" << rv << "] " << gai_strerror(rv);
787 if (result) {
788 freeaddrinfo(result);
789 result = nullptr;
790 }
791 });
792 }
793 for (std::thread& thread : threads) {
794 thread.join();
795 }
796}
797
798TEST_F(ResolverTest, GetAddrInfoStressTest_Binder_100) {
799 const unsigned num_hosts = 100;
800 const unsigned num_threads = 100;
801 const unsigned num_queries = 100;
802 ASSERT_NO_FATAL_FAILURE(RunGetAddrInfoStressTest_Binder(num_hosts, num_threads, num_queries));
803}
804
805TEST_F(ResolverTest, GetAddrInfoStressTest_Binder_100000) {
806 const unsigned num_hosts = 100000;
807 const unsigned num_threads = 100;
808 const unsigned num_queries = 100;
809 ASSERT_NO_FATAL_FAILURE(RunGetAddrInfoStressTest_Binder(num_hosts, num_threads, num_queries));
810}
811
812TEST_F(ResolverTest, EmptySetup) {
813 using android::net::INetd;
814 std::vector<std::string> servers;
815 std::vector<std::string> domains;
816 ASSERT_TRUE(SetResolversForNetwork(servers, domains, mDefaultParams_Binder));
817 std::vector<std::string> res_servers;
818 std::vector<std::string> res_domains;
Mike Yuda77e8e2018-11-26 13:26:21 +0900819 std::vector<std::string> res_tls_servers;
Bernie Innocenti443489e2018-08-10 14:27:23 +0900820 __res_params res_params;
821 std::vector<ResolverStats> res_stats;
Mike Yuda77e8e2018-11-26 13:26:21 +0900822 ASSERT_TRUE(
823 GetResolverInfo(&res_servers, &res_domains, &res_tls_servers, &res_params, &res_stats));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900824 EXPECT_EQ(0U, res_servers.size());
825 EXPECT_EQ(0U, res_domains.size());
Mike Yuda77e8e2018-11-26 13:26:21 +0900826 EXPECT_EQ(0U, res_tls_servers.size());
Sehee Park8659b8d2018-11-16 10:53:16 +0900827 ASSERT_EQ(static_cast<size_t>(INetd::RESOLVER_PARAMS_COUNT), mDefaultParams_Binder.size());
Bernie Innocenti443489e2018-08-10 14:27:23 +0900828 EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_SAMPLE_VALIDITY],
829 res_params.sample_validity);
830 EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_SUCCESS_THRESHOLD],
831 res_params.success_threshold);
832 EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_MIN_SAMPLES], res_params.min_samples);
833 EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_MAX_SAMPLES], res_params.max_samples);
834 EXPECT_EQ(mDefaultParams_Binder[INetd::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC],
835 res_params.base_timeout_msec);
836}
837
838TEST_F(ResolverTest, SearchPathChange) {
Bernie Innocenti443489e2018-08-10 14:27:23 +0900839 const char* listen_addr = "127.0.0.13";
840 const char* listen_srv = "53";
841 const char* host_name1 = "test13.domain1.org.";
842 const char* host_name2 = "test13.domain2.org.";
843 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
844 dns.addMapping(host_name1, ns_type::ns_t_aaaa, "2001:db8::13");
845 dns.addMapping(host_name2, ns_type::ns_t_aaaa, "2001:db8::1:13");
846 ASSERT_TRUE(dns.startServer());
847 std::vector<std::string> servers = { listen_addr };
848 std::vector<std::string> domains = { "domain1.org" };
849 ASSERT_TRUE(SetResolversForNetwork(servers, domains, mDefaultParams_Binder));
850
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900851 const addrinfo hints = {.ai_family = AF_INET6};
852 ScopedAddrinfo result = safe_getaddrinfo("test13", nullptr, &hints);
853 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900854 EXPECT_EQ(1U, dns.queries().size());
855 EXPECT_EQ(1U, GetNumQueries(dns, host_name1));
856 EXPECT_EQ("2001:db8::13", ToString(result));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900857
858 // Test that changing the domain search path on its own works.
859 domains = { "domain2.org" };
860 ASSERT_TRUE(SetResolversForNetwork(servers, domains, mDefaultParams_Binder));
861 dns.clearQueries();
862
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900863 result = safe_getaddrinfo("test13", nullptr, &hints);
864 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +0900865 EXPECT_EQ(1U, dns.queries().size());
866 EXPECT_EQ(1U, GetNumQueries(dns, host_name2));
867 EXPECT_EQ("2001:db8::1:13", ToString(result));
Bernie Innocenti443489e2018-08-10 14:27:23 +0900868}
869
Bernie Innocenti443489e2018-08-10 14:27:23 +0900870static std::string base64Encode(const std::vector<uint8_t>& input) {
871 size_t out_len;
872 EXPECT_EQ(1, EVP_EncodedLength(&out_len, input.size()));
873 // out_len includes the trailing NULL.
874 uint8_t output_bytes[out_len];
875 EXPECT_EQ(out_len - 1, EVP_EncodeBlock(output_bytes, input.data(), input.size()));
876 return std::string(reinterpret_cast<char*>(output_bytes));
877}
878
Mike Yuda77e8e2018-11-26 13:26:21 +0900879// If we move this function to dns_responder_client, it will complicate the dependency need of
880// dns_tls_frontend.h.
881static void setupTlsServers(const std::vector<std::string>& servers,
882 std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls,
883 std::vector<std::string>* fingerprints) {
884 const char* listen_udp = "53";
885 const char* listen_tls = "853";
886
887 for (const auto& server : servers) {
888 auto t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
889 t = std::make_unique<test::DnsTlsFrontend>(server, listen_tls, server, listen_udp);
890 t->startServer();
891 fingerprints->push_back(base64Encode(t->fingerprint()));
892 tls->push_back(std::move(t));
893 }
894}
895
896static void shutdownTlsServers(std::vector<std::unique_ptr<test::DnsTlsFrontend>>* tls) {
897 for (const auto& t : *tls) {
898 t->stopServer();
899 }
900 tls->clear();
901}
902
903TEST_F(ResolverTest, MaxServerPrune_Binder) {
904 using android::net::INetd;
905
906 std::vector<std::string> domains;
907 std::vector<std::unique_ptr<test::DNSResponder>> dns;
908 std::vector<std::unique_ptr<test::DnsTlsFrontend>> tls;
909 std::vector<std::string> servers;
910 std::vector<std::string> fingerprints;
911 std::vector<Mapping> mappings;
912
913 for (unsigned i = 0; i < MAXDNSRCH + 1; i++) {
914 domains.push_back(StringPrintf("example%u.com", i));
915 }
916 ASSERT_NO_FATAL_FAILURE(SetupMappings(1, domains, &mappings));
917 ASSERT_NO_FATAL_FAILURE(SetupDNSServers(MAXNS + 1, mappings, &dns, &servers));
918 ASSERT_NO_FATAL_FAILURE(setupTlsServers(servers, &tls, &fingerprints));
919
920 ASSERT_TRUE(SetResolversWithTls(servers, domains, mDefaultParams_Binder, "", fingerprints));
921
922 std::vector<std::string> res_servers;
923 std::vector<std::string> res_domains;
924 std::vector<std::string> res_tls_servers;
925 __res_params res_params;
926 std::vector<ResolverStats> res_stats;
927 ASSERT_TRUE(
928 GetResolverInfo(&res_servers, &res_domains, &res_tls_servers, &res_params, &res_stats));
929
930 // Check the size of the stats and its contents.
931 EXPECT_EQ(static_cast<size_t>(MAXNS), res_servers.size());
932 EXPECT_EQ(static_cast<size_t>(MAXNS), res_tls_servers.size());
933 EXPECT_EQ(static_cast<size_t>(MAXDNSRCH), res_domains.size());
934 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_servers.begin()));
935 EXPECT_TRUE(std::equal(servers.begin(), servers.begin() + MAXNS, res_tls_servers.begin()));
936 EXPECT_TRUE(std::equal(domains.begin(), domains.begin() + MAXDNSRCH, res_domains.begin()));
937
938 ASSERT_NO_FATAL_FAILURE(ShutdownDNSServers(&dns));
939 ASSERT_NO_FATAL_FAILURE(shutdownTlsServers(&tls));
940}
941
942TEST_F(ResolverTest, ResolverStats) {
943 const char* listen_addr1 = "127.0.0.4";
944 const char* listen_addr2 = "127.0.0.5";
945 const char* listen_addr3 = "127.0.0.6";
946 const char* listen_srv = "53";
947 const char* host_name = "hello.example.com.";
948
949 // Set server 1 timeout.
950 test::DNSResponder dns1(listen_addr1, listen_srv, 250, static_cast<ns_rcode>(-1));
951 dns1.setResponseProbability(0.0);
952 ASSERT_TRUE(dns1.startServer());
953
954 // Set server 2 responding server failure.
955 test::DNSResponder dns2(listen_addr2, listen_srv, 250, ns_rcode::ns_r_servfail);
956 dns2.setResponseProbability(0.0);
957 ASSERT_TRUE(dns2.startServer());
958
959 // Set server 3 workable.
960 test::DNSResponder dns3(listen_addr3, listen_srv, 250, ns_rcode::ns_r_servfail);
961 dns3.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
962 ASSERT_TRUE(dns3.startServer());
963
964 std::vector<std::string> servers = {listen_addr1, listen_addr2, listen_addr3};
965 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
966
967 dns3.clearQueries();
968 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
969 ScopedAddrinfo result = safe_getaddrinfo("hello", nullptr, &hints);
970 size_t found = GetNumQueries(dns3, host_name);
971 EXPECT_LE(1U, found);
972 std::string result_str = ToString(result);
973 EXPECT_TRUE(result_str == "1.2.3.4") << ", result_str='" << result_str << "'";
974
975 std::vector<std::string> res_servers;
976 std::vector<std::string> res_domains;
977 std::vector<std::string> res_tls_servers;
978 __res_params res_params;
979 std::vector<ResolverStats> res_stats;
980 ASSERT_TRUE(
981 GetResolverInfo(&res_servers, &res_domains, &res_tls_servers, &res_params, &res_stats));
982
983 EXPECT_EQ(1, res_stats[0].timeouts);
984 EXPECT_EQ(1, res_stats[1].errors);
985 EXPECT_EQ(1, res_stats[2].successes);
986
987 dns1.stopServer();
988 dns2.stopServer();
989 dns3.stopServer();
990}
991
Bernie Innocenti443489e2018-08-10 14:27:23 +0900992// Test what happens if the specified TLS server is nonexistent.
993TEST_F(ResolverTest, GetHostByName_TlsMissing) {
994 const char* listen_addr = "127.0.0.3";
995 const char* listen_srv = "53";
996 const char* host_name = "tlsmissing.example.com.";
997 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
998 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.3");
999 ASSERT_TRUE(dns.startServer());
1000 std::vector<std::string> servers = { listen_addr };
1001
1002 // There's nothing listening on this address, so validation will either fail or
1003 /// hang. Either way, queries will continue to flow to the DNSResponder.
1004 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder, "", {}));
1005
1006 const hostent* result;
1007
1008 result = gethostbyname("tlsmissing");
1009 ASSERT_FALSE(result == nullptr);
1010 EXPECT_EQ("1.2.3.3", ToString(result));
1011
1012 // Clear TLS bit.
1013 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1014 dns.stopServer();
1015}
1016
1017// Test what happens if the specified TLS server replies with garbage.
1018TEST_F(ResolverTest, GetHostByName_TlsBroken) {
1019 const char* listen_addr = "127.0.0.3";
1020 const char* listen_srv = "53";
1021 const char* host_name1 = "tlsbroken1.example.com.";
1022 const char* host_name2 = "tlsbroken2.example.com.";
1023 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
1024 dns.addMapping(host_name1, ns_type::ns_t_a, "1.2.3.1");
1025 dns.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.2");
1026 ASSERT_TRUE(dns.startServer());
1027 std::vector<std::string> servers = { listen_addr };
1028
1029 // Bind the specified private DNS socket but don't respond to any client sockets yet.
1030 int s = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, IPPROTO_TCP);
1031 ASSERT_TRUE(s >= 0);
1032 struct sockaddr_in tlsServer = {
1033 .sin_family = AF_INET,
1034 .sin_port = htons(853),
1035 };
1036 ASSERT_TRUE(inet_pton(AF_INET, listen_addr, &tlsServer.sin_addr));
Bernie Innocenti6f9fd902018-10-11 20:50:23 +09001037 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEPORT).ok());
1038 ASSERT_TRUE(enableSockopt(s, SOL_SOCKET, SO_REUSEADDR).ok());
Bernie Innocenti443489e2018-08-10 14:27:23 +09001039 ASSERT_FALSE(bind(s, reinterpret_cast<struct sockaddr*>(&tlsServer), sizeof(tlsServer)));
1040 ASSERT_FALSE(listen(s, 1));
1041
1042 // Trigger TLS validation.
1043 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder, "", {}));
1044
1045 struct sockaddr_storage cliaddr;
1046 socklen_t sin_size = sizeof(cliaddr);
1047 int new_fd = accept4(s, reinterpret_cast<struct sockaddr *>(&cliaddr), &sin_size, SOCK_CLOEXEC);
1048 ASSERT_TRUE(new_fd > 0);
1049
1050 // We've received the new file descriptor but not written to it or closed, so the
1051 // validation is still pending. Queries should still flow correctly because the
1052 // server is not used until validation succeeds.
1053 const hostent* result;
1054 result = gethostbyname("tlsbroken1");
1055 ASSERT_FALSE(result == nullptr);
1056 EXPECT_EQ("1.2.3.1", ToString(result));
1057
1058 // Now we cause the validation to fail.
1059 std::string garbage = "definitely not a valid TLS ServerHello";
1060 write(new_fd, garbage.data(), garbage.size());
1061 close(new_fd);
1062
1063 // Validation failure shouldn't interfere with lookups, because lookups won't be sent
1064 // to the TLS server unless validation succeeds.
1065 result = gethostbyname("tlsbroken2");
1066 ASSERT_FALSE(result == nullptr);
1067 EXPECT_EQ("1.2.3.2", ToString(result));
1068
1069 // Clear TLS bit.
1070 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1071 dns.stopServer();
1072 close(s);
1073}
1074
1075TEST_F(ResolverTest, GetHostByName_Tls) {
1076 const char* listen_addr = "127.0.0.3";
1077 const char* listen_udp = "53";
1078 const char* listen_tls = "853";
1079 const char* host_name1 = "tls1.example.com.";
1080 const char* host_name2 = "tls2.example.com.";
1081 const char* host_name3 = "tls3.example.com.";
1082 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1083 dns.addMapping(host_name1, ns_type::ns_t_a, "1.2.3.1");
1084 dns.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.2");
1085 dns.addMapping(host_name3, ns_type::ns_t_a, "1.2.3.3");
1086 ASSERT_TRUE(dns.startServer());
1087 std::vector<std::string> servers = { listen_addr };
1088
1089 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1090 ASSERT_TRUE(tls.startServer());
1091 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder, "", {}));
1092
1093 const hostent* result;
1094
1095 // Wait for validation to complete.
1096 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1097
1098 result = gethostbyname("tls1");
1099 ASSERT_FALSE(result == nullptr);
1100 EXPECT_EQ("1.2.3.1", ToString(result));
1101
1102 // Wait for query to get counted.
1103 EXPECT_TRUE(tls.waitForQueries(2, 5000));
1104
1105 // Stop the TLS server. Since we're in opportunistic mode, queries will
1106 // fall back to the locally-assigned (clear text) nameservers.
1107 tls.stopServer();
1108
1109 dns.clearQueries();
1110 result = gethostbyname("tls2");
1111 EXPECT_FALSE(result == nullptr);
1112 EXPECT_EQ("1.2.3.2", ToString(result));
1113 const auto queries = dns.queries();
1114 EXPECT_EQ(1U, queries.size());
1115 EXPECT_EQ("tls2.example.com.", queries[0].first);
1116 EXPECT_EQ(ns_t_a, queries[0].second);
1117
1118 // Reset the resolvers without enabling TLS. Queries should still be routed
1119 // to the UDP endpoint.
1120 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1121
1122 result = gethostbyname("tls3");
1123 ASSERT_FALSE(result == nullptr);
1124 EXPECT_EQ("1.2.3.3", ToString(result));
1125
1126 dns.stopServer();
1127}
1128
1129TEST_F(ResolverTest, GetHostByName_TlsFingerprint) {
1130 const char* listen_addr = "127.0.0.3";
1131 const char* listen_udp = "53";
1132 const char* listen_tls = "853";
1133 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1134 ASSERT_TRUE(dns.startServer());
1135 for (int chain_length = 1; chain_length <= 3; ++chain_length) {
Bernie Innocentif2572392018-10-02 19:04:56 +09001136 std::string host_name = StringPrintf("tlsfingerprint%d.example.com.", chain_length);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001137 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.1");
1138 std::vector<std::string> servers = { listen_addr };
1139
1140 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1141 tls.set_chain_length(chain_length);
1142 ASSERT_TRUE(tls.startServer());
1143 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder, "",
1144 { base64Encode(tls.fingerprint()) }));
1145
1146 const hostent* result;
1147
1148 // Wait for validation to complete.
1149 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1150
1151 result = gethostbyname(StringPrintf("tlsfingerprint%d", chain_length).c_str());
1152 EXPECT_FALSE(result == nullptr);
1153 if (result) {
1154 EXPECT_EQ("1.2.3.1", ToString(result));
1155
1156 // Wait for query to get counted.
1157 EXPECT_TRUE(tls.waitForQueries(2, 5000));
1158 }
1159
1160 // Clear TLS bit to ensure revalidation.
1161 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1162 tls.stopServer();
1163 }
1164 dns.stopServer();
1165}
1166
1167TEST_F(ResolverTest, GetHostByName_BadTlsFingerprint) {
1168 const char* listen_addr = "127.0.0.3";
1169 const char* listen_udp = "53";
1170 const char* listen_tls = "853";
1171 const char* host_name = "badtlsfingerprint.example.com.";
1172 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1173 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.1");
1174 ASSERT_TRUE(dns.startServer());
1175 std::vector<std::string> servers = { listen_addr };
1176
1177 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1178 ASSERT_TRUE(tls.startServer());
1179 std::vector<uint8_t> bad_fingerprint = tls.fingerprint();
1180 bad_fingerprint[5] += 1; // Corrupt the fingerprint.
1181 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder, "",
1182 { base64Encode(bad_fingerprint) }));
1183
1184 // The initial validation should fail at the fingerprint check before
1185 // issuing a query.
1186 EXPECT_FALSE(tls.waitForQueries(1, 500));
1187
1188 // A fingerprint was provided and failed to match, so the query should fail.
1189 EXPECT_EQ(nullptr, gethostbyname("badtlsfingerprint"));
1190
1191 // Clear TLS bit.
1192 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1193 tls.stopServer();
1194 dns.stopServer();
1195}
1196
1197// Test that we can pass two different fingerprints, and connection succeeds as long as
1198// at least one of them matches the server.
1199TEST_F(ResolverTest, GetHostByName_TwoTlsFingerprints) {
1200 const char* listen_addr = "127.0.0.3";
1201 const char* listen_udp = "53";
1202 const char* listen_tls = "853";
1203 const char* host_name = "twotlsfingerprints.example.com.";
1204 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1205 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.1");
1206 ASSERT_TRUE(dns.startServer());
1207 std::vector<std::string> servers = { listen_addr };
1208
1209 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1210 ASSERT_TRUE(tls.startServer());
1211 std::vector<uint8_t> bad_fingerprint = tls.fingerprint();
1212 bad_fingerprint[5] += 1; // Corrupt the fingerprint.
1213 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder, "",
1214 { base64Encode(bad_fingerprint), base64Encode(tls.fingerprint()) }));
1215
1216 const hostent* result;
1217
1218 // Wait for validation to complete.
1219 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1220
1221 result = gethostbyname("twotlsfingerprints");
1222 ASSERT_FALSE(result == nullptr);
1223 EXPECT_EQ("1.2.3.1", ToString(result));
1224
1225 // Wait for query to get counted.
1226 EXPECT_TRUE(tls.waitForQueries(2, 5000));
1227
1228 // Clear TLS bit.
1229 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1230 tls.stopServer();
1231 dns.stopServer();
1232}
1233
1234TEST_F(ResolverTest, GetHostByName_TlsFingerprintGoesBad) {
1235 const char* listen_addr = "127.0.0.3";
1236 const char* listen_udp = "53";
1237 const char* listen_tls = "853";
1238 const char* host_name1 = "tlsfingerprintgoesbad1.example.com.";
1239 const char* host_name2 = "tlsfingerprintgoesbad2.example.com.";
1240 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1241 dns.addMapping(host_name1, ns_type::ns_t_a, "1.2.3.1");
1242 dns.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.2");
1243 ASSERT_TRUE(dns.startServer());
1244 std::vector<std::string> servers = { listen_addr };
1245
1246 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1247 ASSERT_TRUE(tls.startServer());
1248 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder, "",
1249 { base64Encode(tls.fingerprint()) }));
1250
1251 const hostent* result;
1252
1253 // Wait for validation to complete.
1254 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1255
1256 result = gethostbyname("tlsfingerprintgoesbad1");
1257 ASSERT_FALSE(result == nullptr);
1258 EXPECT_EQ("1.2.3.1", ToString(result));
1259
1260 // Wait for query to get counted.
1261 EXPECT_TRUE(tls.waitForQueries(2, 5000));
1262
1263 // Restart the TLS server. This will generate a new certificate whose fingerprint
1264 // no longer matches the stored fingerprint.
1265 tls.stopServer();
1266 tls.startServer();
1267
1268 result = gethostbyname("tlsfingerprintgoesbad2");
1269 ASSERT_TRUE(result == nullptr);
1270 EXPECT_EQ(HOST_NOT_FOUND, h_errno);
1271
1272 // Clear TLS bit.
1273 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1274 tls.stopServer();
1275 dns.stopServer();
1276}
1277
1278TEST_F(ResolverTest, GetHostByName_TlsFailover) {
1279 const char* listen_addr1 = "127.0.0.3";
1280 const char* listen_addr2 = "127.0.0.4";
1281 const char* listen_udp = "53";
1282 const char* listen_tls = "853";
1283 const char* host_name1 = "tlsfailover1.example.com.";
1284 const char* host_name2 = "tlsfailover2.example.com.";
1285 test::DNSResponder dns1(listen_addr1, listen_udp, 250, ns_rcode::ns_r_servfail);
1286 test::DNSResponder dns2(listen_addr2, listen_udp, 250, ns_rcode::ns_r_servfail);
1287 dns1.addMapping(host_name1, ns_type::ns_t_a, "1.2.3.1");
1288 dns1.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.2");
1289 dns2.addMapping(host_name1, ns_type::ns_t_a, "1.2.3.3");
1290 dns2.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.4");
1291 ASSERT_TRUE(dns1.startServer());
1292 ASSERT_TRUE(dns2.startServer());
1293 std::vector<std::string> servers = { listen_addr1, listen_addr2 };
1294
1295 test::DnsTlsFrontend tls1(listen_addr1, listen_tls, listen_addr1, listen_udp);
1296 test::DnsTlsFrontend tls2(listen_addr2, listen_tls, listen_addr2, listen_udp);
1297 ASSERT_TRUE(tls1.startServer());
1298 ASSERT_TRUE(tls2.startServer());
1299 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder, "",
1300 { base64Encode(tls1.fingerprint()), base64Encode(tls2.fingerprint()) }));
1301
1302 const hostent* result;
1303
1304 // Wait for validation to complete.
1305 EXPECT_TRUE(tls1.waitForQueries(1, 5000));
1306 EXPECT_TRUE(tls2.waitForQueries(1, 5000));
1307
1308 result = gethostbyname("tlsfailover1");
1309 ASSERT_FALSE(result == nullptr);
1310 EXPECT_EQ("1.2.3.1", ToString(result));
1311
1312 // Wait for query to get counted.
1313 EXPECT_TRUE(tls1.waitForQueries(2, 5000));
1314 // No new queries should have reached tls2.
1315 EXPECT_EQ(1, tls2.queries());
1316
1317 // Stop tls1. Subsequent queries should attempt to reach tls1, fail, and retry to tls2.
1318 tls1.stopServer();
1319
1320 result = gethostbyname("tlsfailover2");
1321 EXPECT_EQ("1.2.3.4", ToString(result));
1322
1323 // Wait for query to get counted.
1324 EXPECT_TRUE(tls2.waitForQueries(2, 5000));
1325
1326 // No additional queries should have reached the insecure servers.
1327 EXPECT_EQ(2U, dns1.queries().size());
1328 EXPECT_EQ(2U, dns2.queries().size());
1329
1330 // Clear TLS bit.
1331 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1332 tls2.stopServer();
1333 dns1.stopServer();
1334 dns2.stopServer();
1335}
1336
1337TEST_F(ResolverTest, GetHostByName_BadTlsName) {
1338 const char* listen_addr = "127.0.0.3";
1339 const char* listen_udp = "53";
1340 const char* listen_tls = "853";
1341 const char* host_name = "badtlsname.example.com.";
1342 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1343 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.1");
1344 ASSERT_TRUE(dns.startServer());
1345 std::vector<std::string> servers = { listen_addr };
1346
1347 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1348 ASSERT_TRUE(tls.startServer());
1349 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder,
1350 "www.example.com", {}));
1351
1352 // The TLS server's certificate doesn't chain to a known CA, and a nonempty name was specified,
1353 // so the client should fail the TLS handshake before ever issuing a query.
1354 EXPECT_FALSE(tls.waitForQueries(1, 500));
1355
1356 // The query should fail hard, because a name was specified.
1357 EXPECT_EQ(nullptr, gethostbyname("badtlsname"));
1358
1359 // Clear TLS bit.
1360 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1361 tls.stopServer();
1362 dns.stopServer();
1363}
1364
1365TEST_F(ResolverTest, GetAddrInfo_Tls) {
1366 const char* listen_addr = "127.0.0.3";
1367 const char* listen_udp = "53";
1368 const char* listen_tls = "853";
1369 const char* host_name = "addrinfotls.example.com.";
1370 test::DNSResponder dns(listen_addr, listen_udp, 250, ns_rcode::ns_r_servfail);
1371 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1372 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1373 ASSERT_TRUE(dns.startServer());
1374 std::vector<std::string> servers = { listen_addr };
1375
1376 test::DnsTlsFrontend tls(listen_addr, listen_tls, listen_addr, listen_udp);
1377 ASSERT_TRUE(tls.startServer());
1378 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder, "",
1379 { base64Encode(tls.fingerprint()) }));
1380
1381 // Wait for validation to complete.
1382 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1383
1384 dns.clearQueries();
Bernie Innocenti9bf749f2018-08-30 08:37:22 +09001385 ScopedAddrinfo result = safe_getaddrinfo("addrinfotls", nullptr, nullptr);
1386 EXPECT_TRUE(result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001387 size_t found = GetNumQueries(dns, host_name);
1388 EXPECT_LE(1U, found);
1389 // Could be A or AAAA
1390 std::string result_str = ToString(result);
1391 EXPECT_TRUE(result_str == "1.2.3.4" || result_str == "::1.2.3.4")
1392 << ", result_str='" << result_str << "'";
Bernie Innocenti443489e2018-08-10 14:27:23 +09001393 // Wait for both A and AAAA queries to get counted.
1394 EXPECT_TRUE(tls.waitForQueries(3, 5000));
1395
1396 // Clear TLS bit.
1397 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1398 tls.stopServer();
1399 dns.stopServer();
1400}
1401
1402TEST_F(ResolverTest, TlsBypass) {
1403 const char OFF[] = "off";
1404 const char OPPORTUNISTIC[] = "opportunistic";
1405 const char STRICT[] = "strict";
1406
1407 const char GETHOSTBYNAME[] = "gethostbyname";
1408 const char GETADDRINFO[] = "getaddrinfo";
1409 const char GETADDRINFOFORNET[] = "getaddrinfofornet";
1410
1411 const unsigned BYPASS_NETID = NETID_USE_LOCAL_NAMESERVERS | TEST_NETID;
1412
Mike Yu5ae61542018-10-19 22:11:43 +08001413 const std::vector<uint8_t> NOOP_FINGERPRINT(SHA256_SIZE, 0U);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001414
1415 const char ADDR4[] = "192.0.2.1";
1416 const char ADDR6[] = "2001:db8::1";
1417
1418 const char cleartext_addr[] = "127.0.0.53";
1419 const char cleartext_port[] = "53";
1420 const char tls_port[] = "853";
1421 const std::vector<std::string> servers = { cleartext_addr };
1422
1423 test::DNSResponder dns(cleartext_addr, cleartext_port, 250, ns_rcode::ns_r_servfail);
1424 ASSERT_TRUE(dns.startServer());
1425
1426 test::DnsTlsFrontend tls(cleartext_addr, tls_port, cleartext_addr, cleartext_port);
1427
1428 struct TestConfig {
1429 const std::string mode;
1430 const bool withWorkingTLS;
1431 const std::string method;
1432
1433 std::string asHostName() const {
1434 return StringPrintf("%s.%s.%s.",
1435 mode.c_str(),
1436 withWorkingTLS ? "tlsOn" : "tlsOff",
1437 method.c_str());
1438 }
1439 } testConfigs[]{
1440 {OFF, false, GETHOSTBYNAME},
1441 {OPPORTUNISTIC, false, GETHOSTBYNAME},
1442 {STRICT, false, GETHOSTBYNAME},
1443 {OFF, true, GETHOSTBYNAME},
1444 {OPPORTUNISTIC, true, GETHOSTBYNAME},
1445 {STRICT, true, GETHOSTBYNAME},
1446 {OFF, false, GETADDRINFO},
1447 {OPPORTUNISTIC, false, GETADDRINFO},
1448 {STRICT, false, GETADDRINFO},
1449 {OFF, true, GETADDRINFO},
1450 {OPPORTUNISTIC, true, GETADDRINFO},
1451 {STRICT, true, GETADDRINFO},
1452 {OFF, false, GETADDRINFOFORNET},
1453 {OPPORTUNISTIC, false, GETADDRINFOFORNET},
1454 {STRICT, false, GETADDRINFOFORNET},
1455 {OFF, true, GETADDRINFOFORNET},
1456 {OPPORTUNISTIC, true, GETADDRINFOFORNET},
1457 {STRICT, true, GETADDRINFOFORNET},
1458 };
1459
1460 for (const auto& config : testConfigs) {
1461 const std::string testHostName = config.asHostName();
1462 SCOPED_TRACE(testHostName);
1463
1464 // Don't tempt test bugs due to caching.
1465 const char* host_name = testHostName.c_str();
1466 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
1467 dns.addMapping(host_name, ns_type::ns_t_aaaa, ADDR6);
1468
1469 if (config.withWorkingTLS) ASSERT_TRUE(tls.startServer());
1470
1471 if (config.mode == OFF) {
1472 ASSERT_TRUE(SetResolversForNetwork(
1473 servers, mDefaultSearchDomains, mDefaultParams_Binder));
1474 } else if (config.mode == OPPORTUNISTIC) {
1475 ASSERT_TRUE(SetResolversWithTls(
1476 servers, mDefaultSearchDomains, mDefaultParams_Binder, "", {}));
1477 // Wait for validation to complete.
1478 if (config.withWorkingTLS) EXPECT_TRUE(tls.waitForQueries(1, 5000));
1479 } else if (config.mode == STRICT) {
1480 // We use the existence of fingerprints to trigger strict mode,
1481 // rather than hostname validation.
1482 const auto& fingerprint =
1483 (config.withWorkingTLS) ? tls.fingerprint() : NOOP_FINGERPRINT;
1484 ASSERT_TRUE(SetResolversWithTls(
1485 servers, mDefaultSearchDomains, mDefaultParams_Binder, "",
1486 { base64Encode(fingerprint) }));
1487 // Wait for validation to complete.
1488 if (config.withWorkingTLS) EXPECT_TRUE(tls.waitForQueries(1, 5000));
1489 } else {
1490 FAIL() << "Unsupported Private DNS mode: " << config.mode;
1491 }
1492
1493 const int tlsQueriesBefore = tls.queries();
1494
1495 const hostent* h_result = nullptr;
Bernie Innocenti9bf749f2018-08-30 08:37:22 +09001496 ScopedAddrinfo ai_result;
Bernie Innocenti443489e2018-08-10 14:27:23 +09001497
1498 if (config.method == GETHOSTBYNAME) {
1499 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
1500 h_result = gethostbyname(host_name);
1501
1502 EXPECT_EQ(1U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
1503 ASSERT_FALSE(h_result == nullptr);
1504 ASSERT_EQ(4, h_result->h_length);
1505 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
1506 EXPECT_EQ(ADDR4, ToString(h_result));
1507 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
1508 } else if (config.method == GETADDRINFO) {
1509 ASSERT_EQ(0, setNetworkForResolv(BYPASS_NETID));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +09001510 ai_result = safe_getaddrinfo(host_name, nullptr, nullptr);
1511 EXPECT_TRUE(ai_result != nullptr);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001512
1513 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1514 // Could be A or AAAA
1515 const std::string result_str = ToString(ai_result);
1516 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
1517 << ", result_str='" << result_str << "'";
1518 } else if (config.method == GETADDRINFOFORNET) {
Bernie Innocenti9bf749f2018-08-30 08:37:22 +09001519 addrinfo* raw_ai_result = nullptr;
Bernie Innocentic165ce82018-10-16 23:35:28 +09001520 EXPECT_EQ(0, android_getaddrinfofornet(host_name, /*servname=*/nullptr,
1521 /*hints=*/nullptr, BYPASS_NETID, MARK_UNSET,
1522 &raw_ai_result));
Bernie Innocenti9bf749f2018-08-30 08:37:22 +09001523 ai_result.reset(raw_ai_result);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001524
1525 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1526 // Could be A or AAAA
1527 const std::string result_str = ToString(ai_result);
1528 EXPECT_TRUE(result_str == ADDR4 || result_str == ADDR6)
1529 << ", result_str='" << result_str << "'";
1530 } else {
1531 FAIL() << "Unsupported query method: " << config.method;
1532 }
1533
1534 const int tlsQueriesAfter = tls.queries();
1535 EXPECT_EQ(0, tlsQueriesAfter - tlsQueriesBefore);
1536
Bernie Innocenti443489e2018-08-10 14:27:23 +09001537 // Clear per-process resolv netid.
1538 ASSERT_EQ(0, setNetworkForResolv(NETID_UNSET));
1539 tls.stopServer();
1540 dns.clearQueries();
1541 }
1542
1543 dns.stopServer();
1544}
1545
1546TEST_F(ResolverTest, StrictMode_NoTlsServers) {
Mike Yu5ae61542018-10-19 22:11:43 +08001547 const std::vector<uint8_t> NOOP_FINGERPRINT(SHA256_SIZE, 0U);
Bernie Innocenti443489e2018-08-10 14:27:23 +09001548 const char cleartext_addr[] = "127.0.0.53";
1549 const char cleartext_port[] = "53";
1550 const std::vector<std::string> servers = { cleartext_addr };
1551
1552 test::DNSResponder dns(cleartext_addr, cleartext_port, 250, ns_rcode::ns_r_servfail);
1553 const char* host_name = "strictmode.notlsips.example.com.";
1554 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1555 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1556 ASSERT_TRUE(dns.startServer());
1557
1558 ASSERT_TRUE(SetResolversWithTls(
1559 servers, mDefaultSearchDomains, mDefaultParams_Binder,
1560 {}, "", { base64Encode(NOOP_FINGERPRINT) }));
1561
1562 addrinfo* ai_result = nullptr;
1563 EXPECT_NE(0, getaddrinfo(host_name, nullptr, nullptr, &ai_result));
1564 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
1565}
Luke Huangc68f1b92018-11-21 20:13:38 +08001566
1567namespace {
1568
1569int getAsyncResponse(int fd, int* rcode, u_char* buf, int bufLen) {
1570 struct pollfd wait_fd[1];
1571 wait_fd[0].fd = fd;
1572 wait_fd[0].events = POLLIN;
1573 short revents;
1574 int ret;
1575
1576 ret = poll(wait_fd, 1, -1);
1577 revents = wait_fd[0].revents;
1578 if (revents & POLLIN) {
1579 int n = resNetworkResult(fd, rcode, buf, bufLen);
1580 return n;
1581 }
1582 return -1;
1583}
1584
1585std::string toString(u_char* buf, int bufLen, int ipType) {
1586 ns_msg handle;
1587 int ancount, n = 0;
1588 ns_rr rr;
1589
1590 if (ns_initparse((const uint8_t*) buf, bufLen, &handle) >= 0) {
1591 ancount = ns_msg_count(handle, ns_s_an);
1592 if (ns_parserr(&handle, ns_s_an, n, &rr) == 0) {
1593 const u_char* rdata = ns_rr_rdata(rr);
1594 char buffer[INET6_ADDRSTRLEN];
1595 if (inet_ntop(ipType, (const char*) rdata, buffer, sizeof(buffer))) {
1596 return buffer;
1597 }
1598 }
1599 }
1600 return "";
1601}
1602
1603int dns_open_proxy() {
1604 int s = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
1605 if (s == -1) {
1606 return -1;
1607 }
1608 const int one = 1;
1609 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1610
1611 static const struct sockaddr_un proxy_addr = {
1612 .sun_family = AF_UNIX,
1613 .sun_path = "/dev/socket/dnsproxyd",
1614 };
1615
1616 if (TEMP_FAILURE_RETRY(connect(s, (const struct sockaddr*) &proxy_addr, sizeof(proxy_addr))) !=
1617 0) {
1618 close(s);
1619 return -1;
1620 }
1621
1622 return s;
1623}
1624
1625} // namespace
1626
1627TEST_F(ResolverTest, Async_NormalQueryV4V6) {
1628 const char listen_addr[] = "127.0.0.4";
1629 const char listen_srv[] = "53";
1630 const char host_name[] = "howdy.example.com.";
1631 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
1632 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1633 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1634 ASSERT_TRUE(dns.startServer());
1635 std::vector<std::string> servers = {listen_addr};
1636 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1637 dns.clearQueries();
1638
1639 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", 1, 1); // Type A 1
1640 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", 1, 28); // Type AAAA 28
1641 EXPECT_TRUE(fd1 != -1);
1642 EXPECT_TRUE(fd2 != -1);
1643
1644 u_char buf[MAXPACKET] = {};
1645 int rcode;
1646 int res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
1647 EXPECT_GT(res, 0);
1648 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
1649
1650 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
1651 EXPECT_GT(res, 0);
1652 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
1653
1654 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
1655
1656 // Re-query verify cache works
1657 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", 1, 1); // Type A 1
1658 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", 1, 28); // Type AAAA 28
1659
1660 EXPECT_TRUE(fd1 != -1);
1661 EXPECT_TRUE(fd2 != -1);
1662
1663 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
1664 EXPECT_GT(res, 0);
1665 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
1666
1667 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
1668 EXPECT_GT(res, 0);
1669 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
1670
1671 EXPECT_EQ(2U, GetNumQueries(dns, host_name));
1672}
1673
1674TEST_F(ResolverTest, Async_BadQuery) {
1675 const char listen_addr[] = "127.0.0.4";
1676 const char listen_srv[] = "53";
1677 const char host_name[] = "howdy.example.com.";
1678 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
1679 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1680 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1681 ASSERT_TRUE(dns.startServer());
1682 std::vector<std::string> servers = {listen_addr};
1683 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1684 dns.clearQueries();
1685
1686 static struct {
1687 int fd;
1688 const char* dname;
1689 const int queryType;
1690 const int expectRcode;
1691 } kTestData[] = {
1692 {-1, "", T_AAAA, 0},
1693 {-1, "as65ass46", T_AAAA, 0},
1694 {-1, "454564564564", T_AAAA, 0},
1695 {-1, "h645235", T_A, 0},
1696 {-1, "www.google.com", T_A, 0},
1697 };
1698
1699 for (auto& td : kTestData) {
1700 SCOPED_TRACE(td.dname);
1701 td.fd = resNetworkQuery(TEST_NETID, td.dname, 1, td.queryType);
1702 EXPECT_TRUE(td.fd != -1);
1703 }
1704
1705 // dns_responder return empty resp(packet only contains query part) with no error currently
1706 for (const auto& td : kTestData) {
1707 u_char buf[MAXPACKET] = {};
1708 int rcode;
1709 SCOPED_TRACE(td.dname);
1710 int res = getAsyncResponse(td.fd, &rcode, buf, MAXPACKET);
1711 EXPECT_GT(res, 0);
1712 EXPECT_EQ(rcode, td.expectRcode);
1713 }
1714}
1715
1716TEST_F(ResolverTest, Async_EmptyAnswer) {
1717 const char listen_addr[] = "127.0.0.4";
1718 const char listen_srv[] = "53";
1719 const char host_name[] = "howdy.example.com.";
1720 test::DNSResponder dns(listen_addr, listen_srv, 250, static_cast<ns_rcode>(-1));
1721 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1722 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1723 ASSERT_TRUE(dns.startServer());
1724 std::vector<std::string> servers = {listen_addr};
1725 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1726 dns.clearQueries();
1727
Luke Huang26a0e2a2018-12-18 16:44:41 +08001728 // TODO: Disable retry to make this test explicit.
1729 auto& cv = dns.getCv();
1730 auto& cvMutex = dns.getCvMutex();
1731 int fd1;
1732 // Wait on the condition variable to ensure that the DNS server has handled our first query.
1733 {
1734 std::unique_lock lk(cvMutex);
1735 // A 1 AAAA 28
1736 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", 1, 28);
1737 EXPECT_TRUE(fd1 != -1);
1738 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lk, std::chrono::seconds(1)));
1739 }
Luke Huangc68f1b92018-11-21 20:13:38 +08001740
Luke Huangc68f1b92018-11-21 20:13:38 +08001741 dns.setResponseProbability(0.0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001742
1743 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", 1, 1);
1744 EXPECT_TRUE(fd2 != -1);
1745
1746 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", 1, 1);
1747 EXPECT_TRUE(fd3 != -1);
1748
Luke Huang26a0e2a2018-12-18 16:44:41 +08001749 uint8_t buf[MAXPACKET] = {};
Luke Huangc68f1b92018-11-21 20:13:38 +08001750 int rcode;
1751
Luke Huang26a0e2a2018-12-18 16:44:41 +08001752 // expect no response
1753 int res = getAsyncResponse(fd3, &rcode, buf, MAXPACKET);
1754 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huangc68f1b92018-11-21 20:13:38 +08001755
Luke Huang26a0e2a2018-12-18 16:44:41 +08001756 // expect no response
Luke Huangc68f1b92018-11-21 20:13:38 +08001757 memset(buf, 0, MAXPACKET);
Luke Huang26a0e2a2018-12-18 16:44:41 +08001758 res = getAsyncResponse(fd2, &rcode, buf, MAXPACKET);
1759 EXPECT_EQ(-ETIMEDOUT, res);
Luke Huangc68f1b92018-11-21 20:13:38 +08001760
Luke Huangc68f1b92018-11-21 20:13:38 +08001761 dns.setResponseProbability(1.0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001762
1763 int fd4 = resNetworkQuery(TEST_NETID, "howdy.example.com", 1, 1);
1764 EXPECT_TRUE(fd4 != -1);
1765
1766 memset(buf, 0, MAXPACKET);
1767 res = getAsyncResponse(fd4, &rcode, buf, MAXPACKET);
1768 EXPECT_GT(res, 0);
1769 EXPECT_EQ("1.2.3.4", toString(buf, res, AF_INET));
1770
1771 memset(buf, 0, MAXPACKET);
1772 res = getAsyncResponse(fd1, &rcode, buf, MAXPACKET);
1773 EXPECT_GT(res, 0);
1774 EXPECT_EQ("::1.2.3.4", toString(buf, res, AF_INET6));
1775}
1776
1777TEST_F(ResolverTest, Async_MalformedQuery) {
1778 const char listen_addr[] = "127.0.0.4";
1779 const char listen_srv[] = "53";
1780 const char host_name[] = "howdy.example.com.";
1781 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
1782 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1783 dns.addMapping(host_name, ns_type::ns_t_aaaa, "::1.2.3.4");
1784 ASSERT_TRUE(dns.startServer());
1785 std::vector<std::string> servers = {listen_addr};
1786 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1787 dns.clearQueries();
1788
1789 int fd = dns_open_proxy();
1790 EXPECT_TRUE(fd > 0);
1791
1792 const std::string badMsg = "16-52512#";
1793 static struct {
1794 const std::string cmd;
1795 const int expectErr;
1796 } kTestData[] = {
1797 // Less arguement
1798 {"resnsend " + badMsg + '\0', -EINVAL},
1799 // Bad netId
1800 {"resnsend " + badMsg + " badnetId" + '\0', -EINVAL},
1801 // Bad raw data
1802 {"resnsend " + badMsg + " " + std::to_string(TEST_NETID) + '\0', -EILSEQ},
1803 };
1804
1805 for (unsigned int i = 0; i < std::size(kTestData); i++) {
1806 auto& td = kTestData[i];
1807 SCOPED_TRACE(td.cmd);
1808 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, td.cmd.c_str(), td.cmd.size()));
1809 EXPECT_EQ(rc, static_cast<ssize_t>(td.cmd.size()));
1810
1811 int32_t tmp;
1812 rc = TEMP_FAILURE_RETRY(read(fd, &tmp, sizeof(tmp)));
1813 EXPECT_TRUE(rc > 0);
1814 EXPECT_EQ(static_cast<int>(ntohl(tmp)), td.expectErr);
1815 }
1816 // Normal query with answer buffer
1817 // This is raw data of query "howdy.example.com" type 1 class 1
1818 std::string query = "81sBAAABAAAAAAAABWhvd2R5B2V4YW1wbGUDY29tAAABAAE=";
1819 std::string cmd = "resnsend " + query + " " + std::to_string(TEST_NETID) + '\0';
1820 ssize_t rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
1821 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
1822
1823 u_char smallBuf[1] = {};
1824 int rcode;
1825 rc = getAsyncResponse(fd, &rcode, smallBuf, 1);
1826 EXPECT_EQ(rc, -EMSGSIZE);
1827
1828 // Do the normal test with large buffer again
1829 fd = dns_open_proxy();
1830 EXPECT_TRUE(fd > 0);
1831 rc = TEMP_FAILURE_RETRY(write(fd, cmd.c_str(), cmd.size()));
1832 EXPECT_EQ(rc, static_cast<ssize_t>(cmd.size()));
1833 u_char buf[MAXPACKET] = {};
1834 rc = getAsyncResponse(fd, &rcode, buf, MAXPACKET);
1835 EXPECT_EQ("1.2.3.4", toString(buf, rc, AF_INET));
Mike Yu5b9ffb22018-12-02 17:54:29 +09001836}
1837
1838// This test checks that the resolver should not generate the request containing OPT RR when using
1839// cleartext DNS. If we query the DNS server not supporting EDNS0 and it reponds with FORMERR, we
1840// will fallback to no EDNS0 and try again. If the server does no response, we won't retry so that
1841// we get no answer.
1842TEST_F(ResolverTest, BrokenEdns) {
1843 typedef test::DNSResponder::Edns Edns;
1844 enum ExpectResult { EXPECT_FAILURE, EXPECT_SUCCESS };
1845
1846 const char OFF[] = "off";
1847 const char OPPORTUNISTIC_UDP[] = "opportunistic_udp";
1848 const char OPPORTUNISTIC_TLS[] = "opportunistic_tls";
1849 const char STRICT[] = "strict";
1850 const char GETHOSTBYNAME[] = "gethostbyname";
1851 const char GETADDRINFO[] = "getaddrinfo";
1852 const std::vector<uint8_t> NOOP_FINGERPRINT(SHA256_SIZE, 0U);
1853 const char ADDR4[] = "192.0.2.1";
1854 const char CLEARTEXT_ADDR[] = "127.0.0.53";
1855 const char CLEARTEXT_PORT[] = "53";
1856 const char TLS_PORT[] = "853";
1857 const std::vector<std::string> servers = { CLEARTEXT_ADDR };
1858
1859 test::DNSResponder dns(CLEARTEXT_ADDR, CLEARTEXT_PORT, 250, ns_rcode::ns_r_servfail);
1860 ASSERT_TRUE(dns.startServer());
1861
1862 test::DnsTlsFrontend tls(CLEARTEXT_ADDR, TLS_PORT, CLEARTEXT_ADDR, CLEARTEXT_PORT);
1863
1864 static const struct TestConfig {
1865 std::string mode;
1866 std::string method;
1867 Edns edns;
1868 ExpectResult expectResult;
1869
1870 std::string asHostName() const {
1871 const char* ednsString;
1872 switch (edns) {
1873 case Edns::ON:
1874 ednsString = "ednsOn";
1875 break;
1876 case Edns::FORMERR:
1877 ednsString = "ednsFormerr";
1878 break;
1879 case Edns::DROP:
1880 ednsString = "ednsDrop";
1881 break;
1882 default:
1883 ednsString = "";
1884 break;
1885 }
1886 return StringPrintf("%s.%s.%s.", mode.c_str(), method.c_str(), ednsString);
1887 }
1888 } testConfigs[] = {
1889 // In OPPORTUNISTIC_TLS, we get no answer if the DNS server supports TLS but not EDNS0.
1890 // Could such server exist? if so, we might need to fallback to query cleartext DNS.
1891 // Another thing is that {OPPORTUNISTIC_TLS, Edns::DROP} and {STRICT, Edns::DROP} are
1892 // commented out since TLS timeout is not configurable.
1893 // TODO: Uncomment them after TLS timeout is configurable.
1894 {OFF, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
1895 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
1896 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
1897 {STRICT, GETHOSTBYNAME, Edns::ON, EXPECT_SUCCESS},
1898 {OFF, GETHOSTBYNAME, Edns::FORMERR, EXPECT_SUCCESS},
1899 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::FORMERR, EXPECT_SUCCESS},
1900 {OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::FORMERR, EXPECT_FAILURE},
1901 {STRICT, GETHOSTBYNAME, Edns::FORMERR, EXPECT_FAILURE},
1902 {OFF, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
1903 {OPPORTUNISTIC_UDP, GETHOSTBYNAME, Edns::DROP, EXPECT_SUCCESS},
1904 //{OPPORTUNISTIC_TLS, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
1905 //{STRICT, GETHOSTBYNAME, Edns::DROP, EXPECT_FAILURE},
1906 {OFF, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
1907 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
1908 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
1909 {STRICT, GETADDRINFO, Edns::ON, EXPECT_SUCCESS},
1910 {OFF, GETADDRINFO, Edns::FORMERR, EXPECT_SUCCESS},
1911 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::FORMERR, EXPECT_SUCCESS},
1912 {OPPORTUNISTIC_TLS, GETADDRINFO, Edns::FORMERR, EXPECT_FAILURE},
1913 {STRICT, GETADDRINFO, Edns::FORMERR, EXPECT_FAILURE},
1914 {OFF, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
1915 {OPPORTUNISTIC_UDP, GETADDRINFO, Edns::DROP, EXPECT_SUCCESS},
1916 //{OPPORTUNISTIC_TLS, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
1917 //{STRICT, GETADDRINFO, Edns::DROP, EXPECT_FAILURE},
1918 };
1919
1920 for (const auto& config : testConfigs) {
1921 const std::string testHostName = config.asHostName();
1922 SCOPED_TRACE(testHostName);
1923
1924 const char* host_name = testHostName.c_str();
1925 dns.addMapping(host_name, ns_type::ns_t_a, ADDR4);
1926 dns.setEdns(config.edns);
1927
1928 if (config.mode == OFF) {
1929 ASSERT_TRUE(
1930 SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
1931 } else if (config.mode == OPPORTUNISTIC_UDP) {
1932 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder,
1933 "", {}));
1934 } else if (config.mode == OPPORTUNISTIC_TLS) {
1935 ASSERT_TRUE(tls.startServer());
1936 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder,
1937 "", {}));
1938 // Wait for validation to complete.
1939 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1940 } else if (config.mode == STRICT) {
1941 ASSERT_TRUE(tls.startServer());
1942 ASSERT_TRUE(SetResolversWithTls(servers, mDefaultSearchDomains, mDefaultParams_Binder,
1943 "", {base64Encode(tls.fingerprint())}));
1944 // Wait for validation to complete.
1945 EXPECT_TRUE(tls.waitForQueries(1, 5000));
1946 }
1947
1948 if (config.method == GETHOSTBYNAME) {
1949 const hostent* h_result = gethostbyname(host_name);
1950 if (config.expectResult == EXPECT_SUCCESS) {
1951 EXPECT_LE(1U, GetNumQueries(dns, host_name));
1952 ASSERT_TRUE(h_result != nullptr);
1953 ASSERT_EQ(4, h_result->h_length);
1954 ASSERT_FALSE(h_result->h_addr_list[0] == nullptr);
1955 EXPECT_EQ(ADDR4, ToString(h_result));
1956 EXPECT_TRUE(h_result->h_addr_list[1] == nullptr);
1957 } else {
1958 EXPECT_EQ(0U, GetNumQueriesForType(dns, ns_type::ns_t_a, host_name));
1959 ASSERT_TRUE(h_result == nullptr);
1960 ASSERT_EQ(HOST_NOT_FOUND, h_errno);
1961 }
1962 } else if (config.method == GETADDRINFO) {
1963 ScopedAddrinfo ai_result;
1964 addrinfo hints = {.ai_family = AF_INET, .ai_socktype = SOCK_DGRAM};
1965 ai_result = safe_getaddrinfo(host_name, nullptr, &hints);
1966 if (config.expectResult == EXPECT_SUCCESS) {
1967 EXPECT_TRUE(ai_result != nullptr);
1968 EXPECT_EQ(1U, GetNumQueries(dns, host_name));
1969 const std::string result_str = ToString(ai_result);
1970 EXPECT_EQ(ADDR4, result_str);
1971 } else {
1972 EXPECT_TRUE(ai_result == nullptr);
1973 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
1974 }
1975 } else {
1976 FAIL() << "Unsupported query method: " << config.method;
1977 }
1978
1979 tls.stopServer();
1980 dns.clearQueries();
1981 }
1982
1983 dns.stopServer();
1984}
nuccachenf52f7a52018-07-17 18:07:23 +08001985
1986TEST_F(ResolverTest, GetAddrInfo_Dns64Synthesize) {
1987 constexpr char listen_addr[] = "::1";
1988 constexpr char listen_addr2[] = "127.0.0.5";
1989 constexpr char listen_srv[] = "53";
1990 constexpr char dns64_name[] = "ipv4only.arpa.";
1991 constexpr char host_name[] = "v4only.example.com.";
1992
1993 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
1994 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
1995 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
1996 ASSERT_TRUE(dns.startServer());
1997
1998 test::DNSResponder dns2(listen_addr2, listen_srv, 250, ns_rcode::ns_r_servfail);
1999 dns2.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2000 ASSERT_TRUE(dns2.startServer());
2001
2002 std::vector<std::string> servers = {listen_addr};
2003 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2004 dns.clearQueries();
2005
2006 // Wait for detecting prefix to complete.
2007 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2008
2009 // hints are necessary in order to let netd know which type of addresses the caller is
2010 // interested in.
2011 addrinfo hints;
2012 memset(&hints, 0, sizeof(hints));
2013 hints.ai_family = AF_UNSPEC;
2014 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2015 EXPECT_TRUE(result != nullptr);
2016 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2017
2018 std::string result_str = ToString(result);
2019 EXPECT_EQ(result_str, "64:ff9b::102:304");
2020
2021 // Let's test the case when there's an IPv4 resolver.
2022 servers = {listen_addr, listen_addr2};
2023 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2024 dns.clearQueries();
2025 dns2.clearQueries();
2026
2027 // Netd doesn't detect prefix because there has an IPv4 resolver but all IPv6 resolvers.
2028 EXPECT_FALSE(WaitForPrefix64Detected(TEST_NETID, 1000));
2029
2030 result = safe_getaddrinfo("v4only", nullptr, &hints);
2031 EXPECT_TRUE(result != nullptr);
2032 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2033
2034 result_str = ToString(result);
2035 EXPECT_EQ(result_str, "1.2.3.4");
2036}
2037
2038// blocked by aosp/816674 which causes wrong error code EAI_FAIL (4) but EAI_NODATA (7).
2039// TODO: fix aosp/816674 and add testcases GetAddrInfo_Dns64QuerySpecified back.
2040/*
2041TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecified) {
2042 constexpr char listen_addr[] = "::1";
2043 constexpr char listen_srv[] = "53";
2044 constexpr char dns64_name[] = "ipv4only.arpa.";
2045 constexpr char host_name[] = "v4only.example.com.";
2046
2047 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2048 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2049 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2050 ASSERT_TRUE(dns.startServer());
2051
2052 const std::vector<std::string> servers = {listen_addr};
2053 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2054 dns.clearQueries();
2055
2056 // Wait for detecting prefix to complete.
2057 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2058
2059 // Ensure to synthesize AAAA if AF_INET6 is specified, and not to synthesize AAAA
2060 // in AF_INET case.
2061 addrinfo hints;
2062 memset(&hints, 0, sizeof(hints));
2063 hints.ai_family = AF_INET6;
2064 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2065 EXPECT_TRUE(result != nullptr);
2066 std::string result_str = ToString(result);
2067 EXPECT_EQ(result_str, "64:ff9b::102:304");
2068
2069 hints.ai_family = AF_INET;
2070 result = safe_getaddrinfo("v4only", nullptr, &hints);
2071 EXPECT_TRUE(result != nullptr);
2072 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2073 result_str = ToString(result);
2074 EXPECT_EQ(result_str, "1.2.3.4");
2075}
2076*/
2077
2078TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedV6) {
2079 constexpr char listen_addr[] = "::1";
2080 constexpr char listen_srv[] = "53";
2081 constexpr char dns64_name[] = "ipv4only.arpa.";
2082 constexpr char host_name[] = "v4v6.example.com.";
2083
2084 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2085 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2086 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2087 dns.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4");
2088 ASSERT_TRUE(dns.startServer());
2089
2090 const std::vector<std::string> servers = {listen_addr};
2091 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2092 dns.clearQueries();
2093
2094 // Wait for detecting prefix to complete.
2095 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2096
2097 addrinfo hints;
2098 memset(&hints, 0, sizeof(hints));
2099 hints.ai_family = AF_UNSPEC;
2100 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2101 EXPECT_TRUE(result != nullptr);
2102 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2103
2104 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
2105 std::vector<std::string> result_strs = ToStrings(result);
2106 for (const auto& str : result_strs) {
2107 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2108 << ", result_str='" << str << "'";
2109 }
2110}
2111
2112TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedNoV6) {
2113 constexpr char listen_addr[] = "::1";
2114 constexpr char listen_srv[] = "53";
2115 constexpr char dns64_name[] = "ipv4only.arpa.";
2116 constexpr char host_name[] = "v4v6.example.com.";
2117
2118 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2119 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2120 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2121 ASSERT_TRUE(dns.startServer());
2122
2123 const std::vector<std::string> servers = {listen_addr};
2124 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2125 dns.clearQueries();
2126
2127 // Wait for detecting prefix to complete.
2128 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2129
2130 addrinfo hints;
2131 memset(&hints, 0, sizeof(hints));
2132 hints.ai_family = AF_UNSPEC;
2133 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2134 EXPECT_TRUE(result != nullptr);
2135 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2136
2137 // In AF_UNSPEC case, synthesize AAAA if there's no AAAA answer.
2138 std::string result_str = ToString(result);
2139 EXPECT_EQ(result_str, "64:ff9b::102:304");
2140}
2141
2142TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecialUseIPv4Addresses) {
2143 constexpr char THIS_NETWORK[] = "this_network";
2144 constexpr char LOOPBACK[] = "loopback";
2145 constexpr char LINK_LOCAL[] = "link_local";
2146 constexpr char MULTICAST[] = "multicast";
2147 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
2148
2149 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
2150 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
2151 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
2152 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
2153 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
2154
2155 constexpr char listen_addr[] = "::1";
2156 constexpr char listen_srv[] = "53";
2157 constexpr char dns64_name[] = "ipv4only.arpa.";
2158
2159 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2160 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::");
2161 ASSERT_TRUE(dns.startServer());
2162
2163 const std::vector<std::string> servers = {listen_addr};
2164 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2165 dns.clearQueries();
2166
2167 // Wait for detecting prefix to complete.
2168 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2169
2170 static const struct TestConfig {
2171 std::string name;
2172 std::string addr;
2173
2174 std::string asHostName() const { return StringPrintf("%s.example.com.", name.c_str()); }
2175 } testConfigs[]{
2176 {THIS_NETWORK, ADDR_THIS_NETWORK},
2177 {LOOPBACK, ADDR_LOOPBACK},
2178 {LINK_LOCAL, ADDR_LINK_LOCAL},
2179 {MULTICAST, ADDR_MULTICAST},
2180 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
2181 };
2182
2183 for (const auto& config : testConfigs) {
2184 const std::string testHostName = config.asHostName();
2185 SCOPED_TRACE(testHostName);
2186
2187 const char* host_name = testHostName.c_str();
2188 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
2189
2190 addrinfo hints;
2191 memset(&hints, 0, sizeof(hints));
2192 hints.ai_family = AF_INET6;
2193 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
2194 // In AF_INET6 case, don't return IPv4 answers
2195 EXPECT_TRUE(result == nullptr);
2196 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2197 dns.clearQueries();
2198
2199 memset(&hints, 0, sizeof(hints));
2200 hints.ai_family = AF_UNSPEC;
2201 result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
2202 EXPECT_TRUE(result != nullptr);
2203 // Expect IPv6 query only. IPv4 answer has been cached in previous query.
2204 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2205 // In AF_UNSPEC case, don't synthesize special use IPv4 address.
2206 std::string result_str = ToString(result);
2207 EXPECT_EQ(result_str, config.addr.c_str());
2208 dns.clearQueries();
2209 }
2210}
2211
2212TEST_F(ResolverTest, GetAddrInfo_Dns64QueryWithNullArgumentHints) {
2213 constexpr char listen_addr[] = "::1";
2214 constexpr char listen_srv[] = "53";
2215 constexpr char dns64_name[] = "ipv4only.arpa.";
2216 constexpr char host_name[] = "v4only.example.com.";
2217 constexpr char host_name2[] = "v4v6.example.com.";
2218
2219 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2220 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2221 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2222 dns.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.4");
2223 dns.addMapping(host_name2, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4");
2224 ASSERT_TRUE(dns.startServer());
2225
2226 const std::vector<std::string> servers = {listen_addr};
2227 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2228 dns.clearQueries();
2229
2230 // Wait for detecting prefix to complete.
2231 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2232
2233 // Assign argument hints of getaddrinfo() as null is equivalent to set ai_family AF_UNSPEC.
2234 // In AF_UNSPEC case, synthesize AAAA if there has A answer only.
2235 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, nullptr);
2236 EXPECT_TRUE(result != nullptr);
2237 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2238 std::string result_str = ToString(result);
2239 EXPECT_EQ(result_str, "64:ff9b::102:304");
2240 dns.clearQueries();
2241
2242 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
2243 result = safe_getaddrinfo("v4v6", nullptr, nullptr);
2244 EXPECT_TRUE(result != nullptr);
2245 EXPECT_LE(2U, GetNumQueries(dns, host_name2));
2246 std::vector<std::string> result_strs = ToStrings(result);
2247 for (const auto& str : result_strs) {
2248 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2249 << ", result_str='" << str << "'";
2250 }
2251}
2252
2253TEST_F(ResolverTest, GetAddrInfo_Dns64QueryNullArgumentNode) {
2254 constexpr char ADDR_ANYADDR_V4[] = "0.0.0.0";
2255 constexpr char ADDR_ANYADDR_V6[] = "::";
2256 constexpr char ADDR_LOCALHOST_V4[] = "127.0.0.1";
2257 constexpr char ADDR_LOCALHOST_V6[] = "::1";
2258
2259 constexpr char PORT_NAME_HTTP[] = "http";
2260 constexpr char PORT_NUMBER_HTTP[] = "80";
2261
2262 constexpr char listen_addr[] = "::1";
2263 constexpr char listen_srv[] = "53";
2264 constexpr char dns64_name[] = "ipv4only.arpa.";
2265
2266 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2267 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::");
2268 ASSERT_TRUE(dns.startServer());
2269
2270 const std::vector<std::string> servers = {listen_addr};
2271 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2272 dns.clearQueries();
2273
2274 // Wait for detecting prefix to complete.
2275 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2276
2277 // If node is null, return address is listed by libc/getaddrinfo.c as follows.
2278 // - passive socket -> anyaddr (0.0.0.0 or ::)
2279 // - non-passive socket -> localhost (127.0.0.1 or ::1)
2280 static const struct TestConfig {
2281 int flag;
2282 std::string addr_v4;
2283 std::string addr_v6;
2284
2285 std::string asParameters() const {
2286 return StringPrintf("flag=%d, addr_v4=%s, addr_v6=%s", flag, addr_v4.c_str(),
2287 addr_v6.c_str());
2288 }
2289 } testConfigs[]{
2290 {0 /* non-passive */, ADDR_LOCALHOST_V4, ADDR_LOCALHOST_V6},
2291 {AI_PASSIVE, ADDR_ANYADDR_V4, ADDR_ANYADDR_V6}
2292 };
2293
2294 for (const auto& config : testConfigs) {
2295 SCOPED_TRACE(config.asParameters());
2296
2297 addrinfo hints;
2298 memset(&hints, 0, sizeof(hints));
2299 hints.ai_family = AF_UNSPEC; // any address family
2300 hints.ai_socktype = 0; // any type
2301 hints.ai_protocol = 0; // any protocol
2302 hints.ai_flags = config.flag;
2303
2304 // Assign hostname as null and service as port name.
2305 ScopedAddrinfo result = safe_getaddrinfo(nullptr, PORT_NAME_HTTP, &hints);
2306 ASSERT_TRUE(result != nullptr);
2307
2308 // Can't be synthesized because it should not get into Netd.
2309 std::vector<std::string> result_strs = ToStrings(result);
2310 for (const auto& str : result_strs) {
2311 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
2312 << ", result_str='" << str << "'";
2313 }
2314
2315 // Assign hostname as null and service as numeric port number.
2316 hints.ai_flags = config.flag | AI_NUMERICSERV;
2317 result = safe_getaddrinfo(nullptr, PORT_NUMBER_HTTP, &hints);
2318 ASSERT_TRUE(result != nullptr);
2319
2320 // Can't be synthesized because it should not get into Netd.
2321 result_strs = ToStrings(result);
2322 for (const auto& str : result_strs) {
2323 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
2324 << ", result_str='" << str << "'";
2325 }
2326 }
2327}
2328
2329TEST_F(ResolverTest, GetHostByAddr_ReverseDnsQueryWithHavingNat64Prefix) {
2330 struct hostent* result = nullptr;
2331 struct in_addr v4addr;
2332 struct in6_addr v6addr;
2333
2334 constexpr char listen_addr[] = "::1";
2335 constexpr char listen_srv[] = "53";
2336 constexpr char dns64_name[] = "ipv4only.arpa.";
2337 constexpr char ptr_name[] = "v4v6.example.com.";
2338 // PTR record for IPv4 address 1.2.3.4
2339 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2340 // PTR record for IPv6 address 2001:db8::102:304
2341 constexpr char ptr_addr_v6[] =
2342 "4.0.3.0.2.0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.";
2343
2344 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2345 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2346 dns.addMapping(ptr_addr_v4, ns_type::ns_t_ptr, ptr_name);
2347 dns.addMapping(ptr_addr_v6, ns_type::ns_t_ptr, ptr_name);
2348 ASSERT_TRUE(dns.startServer());
2349
2350 const std::vector<std::string> servers = {listen_addr};
2351 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2352 dns.clearQueries();
2353
2354 // Wait for detecting prefix to complete.
2355 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2356
2357 // Reverse IPv4 DNS query. Prefix should have no effect on it.
2358 inet_pton(AF_INET, "1.2.3.4", &v4addr);
2359 result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
2360 ASSERT_TRUE(result != nullptr);
2361 std::string result_str = result->h_name ? result->h_name : "null";
2362 EXPECT_EQ(result_str, "v4v6.example.com");
2363
2364 // Reverse IPv6 DNS query. Prefix should have no effect on it.
2365 inet_pton(AF_INET6, "2001:db8::102:304", &v6addr);
2366 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2367 ASSERT_TRUE(result != nullptr);
2368 result_str = result->h_name ? result->h_name : "null";
2369 EXPECT_EQ(result_str, "v4v6.example.com");
2370}
2371
2372TEST_F(ResolverTest, GetHostByAddr_ReverseDns64Query) {
2373 constexpr char listen_addr[] = "::1";
2374 constexpr char listen_srv[] = "53";
2375 constexpr char dns64_name[] = "ipv4only.arpa.";
2376 constexpr char ptr_name[] = "v4only.example.com.";
2377 // PTR record for IPv4 address 1.2.3.4
2378 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2379 // PTR record for IPv6 address 64:ff9b::1.2.3.4
2380 constexpr char ptr_addr_v6_nomapping[] =
2381 "4.0.3.0.2.0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.b.9.f.f.4.6.0.0.ip6.arpa.";
2382 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
2383 // PTR record for IPv6 address 64:ff9b::5.6.7.8
2384 constexpr char ptr_addr_v6_synthesis[] =
2385 "8.0.7.0.6.0.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.b.9.f.f.4.6.0.0.ip6.arpa.";
2386
2387 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2388 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2389 dns.addMapping(ptr_addr_v4, ns_type::ns_t_ptr, ptr_name);
2390 dns.addMapping(ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis);
2391 // "ptr_addr_v6_nomapping" is not mapped in DNS server
2392 ASSERT_TRUE(dns.startServer());
2393
2394 const std::vector<std::string> servers = {listen_addr};
2395 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2396 dns.clearQueries();
2397
2398 // Wait for detecting prefix to complete.
2399 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2400
2401 // Synthesized PTR record doesn't exist on DNS server
2402 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
2403 // After querying synthesized address failed, expect that prefix is removed from IPv6
2404 // synthesized address and do reverse IPv4 query instead.
2405 struct in6_addr v6addr;
2406 inet_pton(AF_INET6, "64:ff9b::1.2.3.4", &v6addr);
2407 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2408 ASSERT_TRUE(result != nullptr);
2409 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist
2410 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist
2411 std::string result_str = result->h_name ? result->h_name : "null";
2412 EXPECT_EQ(result_str, "v4only.example.com");
2413 // Check that return address has been mapped from IPv4 to IPv6 address because Netd
2414 // removes NAT64 prefix and does IPv4 DNS reverse lookup in this case. Then, Netd
2415 // fakes the return IPv4 address as original queried IPv6 address.
2416 result_str = ToString(result);
2417 EXPECT_EQ(result_str, "64:ff9b::102:304");
2418 dns.clearQueries();
2419
2420 // Synthesized PTR record exists on DNS server
2421 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
2422 // Expect to Netd pass through synthesized address for DNS queries.
2423 inet_pton(AF_INET6, "64:ff9b::5.6.7.8", &v6addr);
2424 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2425 ASSERT_TRUE(result != nullptr);
2426 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
2427 result_str = result->h_name ? result->h_name : "null";
2428 EXPECT_EQ(result_str, "v6synthesis.example.com");
2429}
2430
2431TEST_F(ResolverTest, GetHostByAddr_ReverseDns64QueryFromHostFile) {
2432 constexpr char dns64_name[] = "ipv4only.arpa.";
2433 constexpr char host_name[] = "localhost";
2434 // The address is synthesized by prefix64:localhost.
2435 constexpr char host_addr[] = "64:ff9b::7f00:1";
2436
2437 constexpr char listen_addr[] = "::1";
2438 constexpr char listen_srv[] = "53";
2439 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2440 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2441 ASSERT_TRUE(dns.startServer());
2442 const std::vector<std::string> servers = {listen_addr};
2443 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2444 dns.clearQueries();
2445
2446 // Wait for detecting prefix to complete.
2447 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2448
2449 // Using synthesized "localhost" address to be a trick for resolving host name
2450 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
2451 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
2452 struct in6_addr v6addr;
2453 inet_pton(AF_INET6, host_addr, &v6addr);
2454 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2455 ASSERT_TRUE(result != nullptr);
2456 // Expect no DNS queries; localhost is resolved via /etc/hosts.
2457 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2458
2459 ASSERT_EQ(sizeof(in6_addr), (unsigned) result->h_length);
2460 ASSERT_EQ(AF_INET6, result->h_addrtype);
2461 std::string result_str = ToString(result);
2462 EXPECT_EQ(result_str, host_addr);
2463 result_str = result->h_name ? result->h_name : "null";
2464 EXPECT_EQ(result_str, host_name);
2465}
2466
2467TEST_F(ResolverTest, GetNameInfo_ReverseDnsQueryWithHavingNat64Prefix) {
2468 constexpr char listen_addr[] = "::1";
2469 constexpr char listen_srv[] = "53";
2470 constexpr char dns64_name[] = "ipv4only.arpa.";
2471 constexpr char ptr_name[] = "v4v6.example.com.";
2472 // PTR record for IPv4 address 1.2.3.4
2473 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2474 // PTR record for IPv6 address 2001:db8::102:304
2475 constexpr char ptr_addr_v6[] =
2476 "4.0.3.0.2.0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.";
2477
2478 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2479 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2480 dns.addMapping(ptr_addr_v4, ns_type::ns_t_ptr, ptr_name);
2481 dns.addMapping(ptr_addr_v6, ns_type::ns_t_ptr, ptr_name);
2482 ASSERT_TRUE(dns.startServer());
2483
2484 const std::vector<std::string> servers = {listen_addr};
2485 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2486 dns.clearQueries();
2487
2488 // Wait for detecting prefix to complete.
2489 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2490
2491 static const struct TestConfig {
2492 int flag;
2493 int family;
2494 std::string addr;
2495 std::string host;
2496
2497 std::string asParameters() const {
2498 return StringPrintf("flag=%d, family=%d, addr=%s, host=%s", flag, family, addr.c_str(),
2499 host.c_str());
2500 }
2501 } testConfigs[]{
2502 {NI_NAMEREQD, AF_INET, "1.2.3.4", "v4v6.example.com"},
2503 {NI_NUMERICHOST, AF_INET, "1.2.3.4", "1.2.3.4"},
2504 {0, AF_INET, "1.2.3.4", "v4v6.example.com"},
2505 {0, AF_INET, "5.6.7.8", "5.6.7.8"}, // unmapped
2506 {NI_NAMEREQD, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
2507 {NI_NUMERICHOST, AF_INET6, "2001:db8::102:304", "2001:db8::102:304"},
2508 {0, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
2509 {0, AF_INET6, "2001:db8::506:708", "2001:db8::506:708"}, // unmapped
2510 };
2511
2512 // Reverse IPv4/IPv6 DNS query. Prefix should have no effect on it.
2513 for (const auto& config : testConfigs) {
2514 SCOPED_TRACE(config.asParameters());
2515
2516 int rv;
2517 char host[NI_MAXHOST];
2518 struct sockaddr_in sin;
2519 struct sockaddr_in6 sin6;
2520 if (config.family == AF_INET) {
2521 memset(&sin, 0, sizeof(sin));
2522 sin.sin_family = AF_INET;
2523 inet_pton(AF_INET, config.addr.c_str(), &sin.sin_addr);
2524 rv = getnameinfo((const struct sockaddr*) &sin, sizeof(sin), host, sizeof(host),
2525 nullptr, 0, config.flag);
2526 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4));
2527 } else if (config.family == AF_INET6) {
2528 memset(&sin6, 0, sizeof(sin6));
2529 sin6.sin6_family = AF_INET6;
2530 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
2531 rv = getnameinfo((const struct sockaddr*) &sin6, sizeof(sin6), host, sizeof(host),
2532 nullptr, 0, config.flag);
2533 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6));
2534 }
2535 ASSERT_EQ(0, rv);
2536 std::string result_str = host;
2537 EXPECT_EQ(result_str, config.host);
2538 dns.clearQueries();
2539 }
2540}
2541
2542TEST_F(ResolverTest, GetNameInfo_ReverseDns64Query) {
2543 constexpr char listen_addr[] = "::1";
2544 constexpr char listen_srv[] = "53";
2545 constexpr char dns64_name[] = "ipv4only.arpa.";
2546 constexpr char ptr_name[] = "v4only.example.com.";
2547 // PTR record for IPv4 address 1.2.3.4
2548 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2549 // PTR record for IPv6 address 64:ff9b::1.2.3.4
2550 constexpr char ptr_addr_v6_nomapping[] =
2551 "4.0.3.0.2.0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.b.9.f.f.4.6.0.0.ip6.arpa.";
2552 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
2553 // PTR record for IPv6 address 64:ff9b::5.6.7.8
2554 constexpr char ptr_addr_v6_synthesis[] =
2555 "8.0.7.0.6.0.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.b.9.f.f.4.6.0.0.ip6.arpa.";
2556
2557 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2558 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2559 dns.addMapping(ptr_addr_v4, ns_type::ns_t_ptr, ptr_name);
2560 dns.addMapping(ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis);
2561 ASSERT_TRUE(dns.startServer());
2562
2563 const std::vector<std::string> servers = {listen_addr};
2564 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2565 dns.clearQueries();
2566
2567 // Wait for detecting prefix to complete.
2568 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2569
2570 static const struct TestConfig {
2571 bool hasSynthesizedPtrRecord;
2572 int flag;
2573 std::string addr;
2574 std::string host;
2575
2576 std::string asParameters() const {
2577 return StringPrintf("hasSynthesizedPtrRecord=%d, flag=%d, addr=%s, host=%s",
2578 hasSynthesizedPtrRecord, flag, addr.c_str(), host.c_str());
2579 }
2580 } testConfigs[]{
2581 {false, NI_NAMEREQD, "64:ff9b::102:304", "v4only.example.com"},
2582 {false, NI_NUMERICHOST, "64:ff9b::102:304", "64:ff9b::102:304"},
2583 {false, 0, "64:ff9b::102:304", "v4only.example.com"},
2584 {true, NI_NAMEREQD, "64:ff9b::506:708", "v6synthesis.example.com"},
2585 {true, NI_NUMERICHOST, "64:ff9b::506:708", "64:ff9b::506:708"},
2586 {true, 0, "64:ff9b::506:708", "v6synthesis.example.com"}
2587 };
2588
2589 // hasSynthesizedPtrRecord = false
2590 // Synthesized PTR record doesn't exist on DNS server
2591 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
2592 // After querying synthesized address failed, expect that prefix is removed from IPv6
2593 // synthesized address and do reverse IPv4 query instead.
2594 //
2595 // hasSynthesizedPtrRecord = true
2596 // Synthesized PTR record exists on DNS server
2597 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
2598 // Expect to just pass through synthesized address for DNS queries.
2599 for (const auto& config : testConfigs) {
2600 SCOPED_TRACE(config.asParameters());
2601
2602 char host[NI_MAXHOST];
2603 struct sockaddr_in6 sin6;
2604 memset(&sin6, 0, sizeof(sin6));
2605 sin6.sin6_family = AF_INET6;
2606 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
2607 int rv = getnameinfo((const struct sockaddr*) &sin6, sizeof(sin6), host, sizeof(host),
2608 nullptr, 0, config.flag);
2609 ASSERT_EQ(0, rv);
2610 if (config.flag == NI_NAMEREQD) {
2611 if (config.hasSynthesizedPtrRecord) {
2612 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
2613 } else {
2614 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist.
2615 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist.
2616 }
2617 }
2618 std::string result_str = host;
2619 EXPECT_EQ(result_str, config.host);
2620 dns.clearQueries();
2621 }
2622}
2623
2624TEST_F(ResolverTest, GetNameInfo_ReverseDns64QueryFromHostFile) {
2625 constexpr char dns64_name[] = "ipv4only.arpa.";
2626 constexpr char host_name[] = "localhost";
2627 // The address is synthesized by prefix64:localhost.
2628 constexpr char host_addr[] = "64:ff9b::7f00:1";
2629
2630 constexpr char listen_addr[] = "::1";
2631 constexpr char listen_srv[] = "53";
2632 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2633 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2634 ASSERT_TRUE(dns.startServer());
2635 const std::vector<std::string> servers = {listen_addr};
2636 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2637 dns.clearQueries();
2638
2639 // Wait for detecting prefix to complete.
2640 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2641
2642 // Using synthesized "localhost" address to be a trick for resolving host name
2643 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
2644 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
2645 char host[NI_MAXHOST];
2646 struct sockaddr_in6 sin6;
2647 memset(&sin6, 0, sizeof(sin6));
2648 sin6.sin6_family = AF_INET6;
2649 inet_pton(AF_INET6, host_addr, &sin6.sin6_addr);
2650 int rv = getnameinfo((const struct sockaddr*) &sin6, sizeof(sin6), host, sizeof(host), nullptr,
2651 0, NI_NAMEREQD);
2652 ASSERT_EQ(0, rv);
2653 // Expect no DNS queries; localhost is resolved via /etc/hosts.
2654 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2655
2656 std::string result_str = host;
2657 EXPECT_EQ(result_str, host_name);
2658}
2659
2660// blocked by aosp/816674 which causes wrong error code EAI_FAIL (4) but EAI_NODATA (7).
2661// TODO:
2662// 1. fix aosp/816674 and add testcases GetHostByName2_Dns64Synthesize back.
2663// 2. Manual test gethostbyname2 synthesis for IPv4 address which comes from host file.
2664/*
2665TEST_F(ResolverTest, GetHostByName2_Dns64Synthesize) {
2666 constexpr char dns64_name[] = "ipv4only.arpa.";
2667 constexpr char host_name[] = "ipv4only.example.com.";
2668
2669 constexpr char listen_addr[] = "::1";
2670 constexpr char listen_srv[] = "53";
2671 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2672 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2673 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2674 ASSERT_TRUE(dns.startServer());
2675 const std::vector<std::string> servers = {listen_addr};
2676 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2677 dns.clearQueries();
2678
2679 // Wait for detecting prefix to complete.
2680 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2681
2682 // Query an IPv4-only hostname. Expect that gets a synthesized address.
2683 struct hostent* result = gethostbyname2("ipv4only", AF_INET6);
2684 ASSERT_TRUE(result != nullptr);
2685 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2686 std::string result_str = ToString(result);
2687 EXPECT_EQ(result_str, "64:ff9b::102:304");
2688}
2689*/
2690
2691TEST_F(ResolverTest, GetHostByName2_DnsQueryWithHavingNat64Prefix) {
2692 constexpr char dns64_name[] = "ipv4only.arpa.";
2693 constexpr char host_name[] = "v4v6.example.com.";
2694
2695 constexpr char listen_addr[] = "::1";
2696 constexpr char listen_srv[] = "53";
2697 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2698 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2699 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2700 dns.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4");
2701 ASSERT_TRUE(dns.startServer());
2702 const std::vector<std::string> servers = {listen_addr};
2703 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2704 dns.clearQueries();
2705
2706 // Wait for detecting prefix to complete.
2707 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2708
2709 // IPv4 DNS query. Prefix should have no effect on it.
2710 struct hostent* result = gethostbyname2("v4v6", AF_INET);
2711 ASSERT_TRUE(result != nullptr);
2712 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2713 std::string result_str = ToString(result);
2714 EXPECT_EQ(result_str, "1.2.3.4");
2715 dns.clearQueries();
2716
2717 // IPv6 DNS query. Prefix should have no effect on it.
2718 result = gethostbyname2("v4v6", AF_INET6);
2719 ASSERT_TRUE(result != nullptr);
2720 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2721 result_str = ToString(result);
2722 EXPECT_EQ(result_str, "2001:db8::102:304");
2723}
2724
2725TEST_F(ResolverTest, GetHostByName2_Dns64QuerySpecialUseIPv4Addresses) {
2726 constexpr char THIS_NETWORK[] = "this_network";
2727 constexpr char LOOPBACK[] = "loopback";
2728 constexpr char LINK_LOCAL[] = "link_local";
2729 constexpr char MULTICAST[] = "multicast";
2730 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
2731
2732 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
2733 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
2734 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
2735 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
2736 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
2737
2738 constexpr char listen_addr[] = "::1";
2739 constexpr char listen_srv[] = "53";
2740 constexpr char dns64_name[] = "ipv4only.arpa.";
2741
2742 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2743 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::");
2744 ASSERT_TRUE(dns.startServer());
2745
2746 const std::vector<std::string> servers = {listen_addr};
2747 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2748 dns.clearQueries();
2749
2750 // Wait for detecting prefix to complete.
2751 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2752
2753 static const struct TestConfig {
2754 std::string name;
2755 std::string addr;
2756
2757 std::string asHostName() const {
2758 return StringPrintf("%s.example.com.",
2759 name.c_str());
2760 }
2761 } testConfigs[]{
2762 {THIS_NETWORK, ADDR_THIS_NETWORK},
2763 {LOOPBACK, ADDR_LOOPBACK},
2764 {LINK_LOCAL, ADDR_LINK_LOCAL},
2765 {MULTICAST, ADDR_MULTICAST},
2766 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
2767 };
2768
2769 for (const auto& config : testConfigs) {
2770 const std::string testHostName = config.asHostName();
2771 SCOPED_TRACE(testHostName);
2772
2773 const char* host_name = testHostName.c_str();
2774 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
2775
2776 struct hostent* result = gethostbyname2(config.name.c_str(), AF_INET6);
2777 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2778
2779 // In AF_INET6 case, don't synthesize special use IPv4 address.
2780 // Expect to have no answer
2781 EXPECT_EQ(nullptr, result);
2782
2783 dns.clearQueries();
2784 }
2785}