blob: 5c5d8339a92c6830281ae28e68fc780b5ea4fc64 [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
Luke Huang110c54e2018-12-20 14:39:58 +08001639 int fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", 1, 1, 0); // Type A 1
1640 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", 1, 28, 0); // Type AAAA 28
Luke Huangc68f1b92018-11-21 20:13:38 +08001641 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
Luke Huang110c54e2018-12-20 14:39:58 +08001657 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", 1, 1, 0); // Type A 1
1658 fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", 1, 28, 0); // Type AAAA 28
Luke Huangc68f1b92018-11-21 20:13:38 +08001659
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);
Luke Huang110c54e2018-12-20 14:39:58 +08001701 td.fd = resNetworkQuery(TEST_NETID, td.dname, 1, td.queryType, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001702 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
Luke Huang110c54e2018-12-20 14:39:58 +08001736 fd1 = resNetworkQuery(TEST_NETID, "howdy.example.com", 1, 28, 0);
Luke Huang26a0e2a2018-12-18 16:44:41 +08001737 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
Luke Huang110c54e2018-12-20 14:39:58 +08001743 int fd2 = resNetworkQuery(TEST_NETID, "howdy.example.com", 1, 1, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001744 EXPECT_TRUE(fd2 != -1);
1745
Luke Huang110c54e2018-12-20 14:39:58 +08001746 int fd3 = resNetworkQuery(TEST_NETID, "howdy.example.com", 1, 1, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001747 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
Luke Huang110c54e2018-12-20 14:39:58 +08001763 int fd4 = resNetworkQuery(TEST_NETID, "howdy.example.com", 1, 1, 0);
Luke Huangc68f1b92018-11-21 20:13:38 +08001764 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
nuccachenf52f7a52018-07-17 18:07:23 +08002038TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecified) {
2039 constexpr char listen_addr[] = "::1";
2040 constexpr char listen_srv[] = "53";
2041 constexpr char dns64_name[] = "ipv4only.arpa.";
2042 constexpr char host_name[] = "v4only.example.com.";
2043
2044 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2045 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2046 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2047 ASSERT_TRUE(dns.startServer());
2048
2049 const std::vector<std::string> servers = {listen_addr};
2050 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2051 dns.clearQueries();
2052
2053 // Wait for detecting prefix to complete.
2054 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2055
2056 // Ensure to synthesize AAAA if AF_INET6 is specified, and not to synthesize AAAA
2057 // in AF_INET case.
2058 addrinfo hints;
2059 memset(&hints, 0, sizeof(hints));
2060 hints.ai_family = AF_INET6;
2061 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, &hints);
2062 EXPECT_TRUE(result != nullptr);
2063 std::string result_str = ToString(result);
2064 EXPECT_EQ(result_str, "64:ff9b::102:304");
2065
2066 hints.ai_family = AF_INET;
2067 result = safe_getaddrinfo("v4only", nullptr, &hints);
2068 EXPECT_TRUE(result != nullptr);
2069 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2070 result_str = ToString(result);
2071 EXPECT_EQ(result_str, "1.2.3.4");
2072}
nuccachenf52f7a52018-07-17 18:07:23 +08002073
2074TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedV6) {
2075 constexpr char listen_addr[] = "::1";
2076 constexpr char listen_srv[] = "53";
2077 constexpr char dns64_name[] = "ipv4only.arpa.";
2078 constexpr char host_name[] = "v4v6.example.com.";
2079
2080 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2081 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2082 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2083 dns.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4");
2084 ASSERT_TRUE(dns.startServer());
2085
2086 const std::vector<std::string> servers = {listen_addr};
2087 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2088 dns.clearQueries();
2089
2090 // Wait for detecting prefix to complete.
2091 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2092
2093 addrinfo hints;
2094 memset(&hints, 0, sizeof(hints));
2095 hints.ai_family = AF_UNSPEC;
2096 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2097 EXPECT_TRUE(result != nullptr);
2098 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2099
2100 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
2101 std::vector<std::string> result_strs = ToStrings(result);
2102 for (const auto& str : result_strs) {
2103 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2104 << ", result_str='" << str << "'";
2105 }
2106}
2107
2108TEST_F(ResolverTest, GetAddrInfo_Dns64QueryUnspecifiedNoV6) {
2109 constexpr char listen_addr[] = "::1";
2110 constexpr char listen_srv[] = "53";
2111 constexpr char dns64_name[] = "ipv4only.arpa.";
2112 constexpr char host_name[] = "v4v6.example.com.";
2113
2114 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2115 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2116 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2117 ASSERT_TRUE(dns.startServer());
2118
2119 const std::vector<std::string> servers = {listen_addr};
2120 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2121 dns.clearQueries();
2122
2123 // Wait for detecting prefix to complete.
2124 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2125
2126 addrinfo hints;
2127 memset(&hints, 0, sizeof(hints));
2128 hints.ai_family = AF_UNSPEC;
2129 ScopedAddrinfo result = safe_getaddrinfo("v4v6", nullptr, &hints);
2130 EXPECT_TRUE(result != nullptr);
2131 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2132
2133 // In AF_UNSPEC case, synthesize AAAA if there's no AAAA answer.
2134 std::string result_str = ToString(result);
2135 EXPECT_EQ(result_str, "64:ff9b::102:304");
2136}
2137
2138TEST_F(ResolverTest, GetAddrInfo_Dns64QuerySpecialUseIPv4Addresses) {
2139 constexpr char THIS_NETWORK[] = "this_network";
2140 constexpr char LOOPBACK[] = "loopback";
2141 constexpr char LINK_LOCAL[] = "link_local";
2142 constexpr char MULTICAST[] = "multicast";
2143 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
2144
2145 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
2146 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
2147 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
2148 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
2149 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
2150
2151 constexpr char listen_addr[] = "::1";
2152 constexpr char listen_srv[] = "53";
2153 constexpr char dns64_name[] = "ipv4only.arpa.";
2154
2155 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2156 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::");
2157 ASSERT_TRUE(dns.startServer());
2158
2159 const std::vector<std::string> servers = {listen_addr};
2160 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2161 dns.clearQueries();
2162
2163 // Wait for detecting prefix to complete.
2164 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2165
2166 static const struct TestConfig {
2167 std::string name;
2168 std::string addr;
2169
2170 std::string asHostName() const { return StringPrintf("%s.example.com.", name.c_str()); }
2171 } testConfigs[]{
2172 {THIS_NETWORK, ADDR_THIS_NETWORK},
2173 {LOOPBACK, ADDR_LOOPBACK},
2174 {LINK_LOCAL, ADDR_LINK_LOCAL},
2175 {MULTICAST, ADDR_MULTICAST},
2176 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
2177 };
2178
2179 for (const auto& config : testConfigs) {
2180 const std::string testHostName = config.asHostName();
2181 SCOPED_TRACE(testHostName);
2182
2183 const char* host_name = testHostName.c_str();
2184 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
2185
2186 addrinfo hints;
2187 memset(&hints, 0, sizeof(hints));
2188 hints.ai_family = AF_INET6;
2189 ScopedAddrinfo result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
2190 // In AF_INET6 case, don't return IPv4 answers
2191 EXPECT_TRUE(result == nullptr);
2192 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2193 dns.clearQueries();
2194
2195 memset(&hints, 0, sizeof(hints));
2196 hints.ai_family = AF_UNSPEC;
2197 result = safe_getaddrinfo(config.name.c_str(), nullptr, &hints);
2198 EXPECT_TRUE(result != nullptr);
2199 // Expect IPv6 query only. IPv4 answer has been cached in previous query.
2200 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2201 // In AF_UNSPEC case, don't synthesize special use IPv4 address.
2202 std::string result_str = ToString(result);
2203 EXPECT_EQ(result_str, config.addr.c_str());
2204 dns.clearQueries();
2205 }
2206}
2207
2208TEST_F(ResolverTest, GetAddrInfo_Dns64QueryWithNullArgumentHints) {
2209 constexpr char listen_addr[] = "::1";
2210 constexpr char listen_srv[] = "53";
2211 constexpr char dns64_name[] = "ipv4only.arpa.";
2212 constexpr char host_name[] = "v4only.example.com.";
2213 constexpr char host_name2[] = "v4v6.example.com.";
2214
2215 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2216 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2217 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2218 dns.addMapping(host_name2, ns_type::ns_t_a, "1.2.3.4");
2219 dns.addMapping(host_name2, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4");
2220 ASSERT_TRUE(dns.startServer());
2221
2222 const std::vector<std::string> servers = {listen_addr};
2223 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2224 dns.clearQueries();
2225
2226 // Wait for detecting prefix to complete.
2227 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2228
2229 // Assign argument hints of getaddrinfo() as null is equivalent to set ai_family AF_UNSPEC.
2230 // In AF_UNSPEC case, synthesize AAAA if there has A answer only.
2231 ScopedAddrinfo result = safe_getaddrinfo("v4only", nullptr, nullptr);
2232 EXPECT_TRUE(result != nullptr);
2233 EXPECT_LE(2U, GetNumQueries(dns, host_name));
2234 std::string result_str = ToString(result);
2235 EXPECT_EQ(result_str, "64:ff9b::102:304");
2236 dns.clearQueries();
2237
2238 // In AF_UNSPEC case, do not synthesize AAAA if there's at least one AAAA answer.
2239 result = safe_getaddrinfo("v4v6", nullptr, nullptr);
2240 EXPECT_TRUE(result != nullptr);
2241 EXPECT_LE(2U, GetNumQueries(dns, host_name2));
2242 std::vector<std::string> result_strs = ToStrings(result);
2243 for (const auto& str : result_strs) {
2244 EXPECT_TRUE(str == "1.2.3.4" || str == "2001:db8::102:304")
2245 << ", result_str='" << str << "'";
2246 }
2247}
2248
2249TEST_F(ResolverTest, GetAddrInfo_Dns64QueryNullArgumentNode) {
2250 constexpr char ADDR_ANYADDR_V4[] = "0.0.0.0";
2251 constexpr char ADDR_ANYADDR_V6[] = "::";
2252 constexpr char ADDR_LOCALHOST_V4[] = "127.0.0.1";
2253 constexpr char ADDR_LOCALHOST_V6[] = "::1";
2254
2255 constexpr char PORT_NAME_HTTP[] = "http";
2256 constexpr char PORT_NUMBER_HTTP[] = "80";
2257
2258 constexpr char listen_addr[] = "::1";
2259 constexpr char listen_srv[] = "53";
2260 constexpr char dns64_name[] = "ipv4only.arpa.";
2261
2262 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2263 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::");
2264 ASSERT_TRUE(dns.startServer());
2265
2266 const std::vector<std::string> servers = {listen_addr};
2267 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2268 dns.clearQueries();
2269
2270 // Wait for detecting prefix to complete.
2271 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2272
2273 // If node is null, return address is listed by libc/getaddrinfo.c as follows.
2274 // - passive socket -> anyaddr (0.0.0.0 or ::)
2275 // - non-passive socket -> localhost (127.0.0.1 or ::1)
2276 static const struct TestConfig {
2277 int flag;
2278 std::string addr_v4;
2279 std::string addr_v6;
2280
2281 std::string asParameters() const {
2282 return StringPrintf("flag=%d, addr_v4=%s, addr_v6=%s", flag, addr_v4.c_str(),
2283 addr_v6.c_str());
2284 }
2285 } testConfigs[]{
2286 {0 /* non-passive */, ADDR_LOCALHOST_V4, ADDR_LOCALHOST_V6},
2287 {AI_PASSIVE, ADDR_ANYADDR_V4, ADDR_ANYADDR_V6}
2288 };
2289
2290 for (const auto& config : testConfigs) {
2291 SCOPED_TRACE(config.asParameters());
2292
2293 addrinfo hints;
2294 memset(&hints, 0, sizeof(hints));
2295 hints.ai_family = AF_UNSPEC; // any address family
2296 hints.ai_socktype = 0; // any type
2297 hints.ai_protocol = 0; // any protocol
2298 hints.ai_flags = config.flag;
2299
2300 // Assign hostname as null and service as port name.
2301 ScopedAddrinfo result = safe_getaddrinfo(nullptr, PORT_NAME_HTTP, &hints);
2302 ASSERT_TRUE(result != nullptr);
2303
2304 // Can't be synthesized because it should not get into Netd.
2305 std::vector<std::string> result_strs = ToStrings(result);
2306 for (const auto& str : result_strs) {
2307 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
2308 << ", result_str='" << str << "'";
2309 }
2310
2311 // Assign hostname as null and service as numeric port number.
2312 hints.ai_flags = config.flag | AI_NUMERICSERV;
2313 result = safe_getaddrinfo(nullptr, PORT_NUMBER_HTTP, &hints);
2314 ASSERT_TRUE(result != nullptr);
2315
2316 // Can't be synthesized because it should not get into Netd.
2317 result_strs = ToStrings(result);
2318 for (const auto& str : result_strs) {
2319 EXPECT_TRUE(str == config.addr_v4 || str == config.addr_v6)
2320 << ", result_str='" << str << "'";
2321 }
2322 }
2323}
2324
2325TEST_F(ResolverTest, GetHostByAddr_ReverseDnsQueryWithHavingNat64Prefix) {
2326 struct hostent* result = nullptr;
2327 struct in_addr v4addr;
2328 struct in6_addr v6addr;
2329
2330 constexpr char listen_addr[] = "::1";
2331 constexpr char listen_srv[] = "53";
2332 constexpr char dns64_name[] = "ipv4only.arpa.";
2333 constexpr char ptr_name[] = "v4v6.example.com.";
2334 // PTR record for IPv4 address 1.2.3.4
2335 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2336 // PTR record for IPv6 address 2001:db8::102:304
2337 constexpr char ptr_addr_v6[] =
2338 "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.";
2339
2340 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2341 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2342 dns.addMapping(ptr_addr_v4, ns_type::ns_t_ptr, ptr_name);
2343 dns.addMapping(ptr_addr_v6, ns_type::ns_t_ptr, ptr_name);
2344 ASSERT_TRUE(dns.startServer());
2345
2346 const std::vector<std::string> servers = {listen_addr};
2347 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2348 dns.clearQueries();
2349
2350 // Wait for detecting prefix to complete.
2351 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2352
2353 // Reverse IPv4 DNS query. Prefix should have no effect on it.
2354 inet_pton(AF_INET, "1.2.3.4", &v4addr);
2355 result = gethostbyaddr(&v4addr, sizeof(v4addr), AF_INET);
2356 ASSERT_TRUE(result != nullptr);
2357 std::string result_str = result->h_name ? result->h_name : "null";
2358 EXPECT_EQ(result_str, "v4v6.example.com");
2359
2360 // Reverse IPv6 DNS query. Prefix should have no effect on it.
2361 inet_pton(AF_INET6, "2001:db8::102:304", &v6addr);
2362 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2363 ASSERT_TRUE(result != nullptr);
2364 result_str = result->h_name ? result->h_name : "null";
2365 EXPECT_EQ(result_str, "v4v6.example.com");
2366}
2367
2368TEST_F(ResolverTest, GetHostByAddr_ReverseDns64Query) {
2369 constexpr char listen_addr[] = "::1";
2370 constexpr char listen_srv[] = "53";
2371 constexpr char dns64_name[] = "ipv4only.arpa.";
2372 constexpr char ptr_name[] = "v4only.example.com.";
2373 // PTR record for IPv4 address 1.2.3.4
2374 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2375 // PTR record for IPv6 address 64:ff9b::1.2.3.4
2376 constexpr char ptr_addr_v6_nomapping[] =
2377 "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.";
2378 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
2379 // PTR record for IPv6 address 64:ff9b::5.6.7.8
2380 constexpr char ptr_addr_v6_synthesis[] =
2381 "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.";
2382
2383 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2384 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2385 dns.addMapping(ptr_addr_v4, ns_type::ns_t_ptr, ptr_name);
2386 dns.addMapping(ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis);
2387 // "ptr_addr_v6_nomapping" is not mapped in DNS server
2388 ASSERT_TRUE(dns.startServer());
2389
2390 const std::vector<std::string> servers = {listen_addr};
2391 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2392 dns.clearQueries();
2393
2394 // Wait for detecting prefix to complete.
2395 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2396
2397 // Synthesized PTR record doesn't exist on DNS server
2398 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
2399 // After querying synthesized address failed, expect that prefix is removed from IPv6
2400 // synthesized address and do reverse IPv4 query instead.
2401 struct in6_addr v6addr;
2402 inet_pton(AF_INET6, "64:ff9b::1.2.3.4", &v6addr);
2403 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2404 ASSERT_TRUE(result != nullptr);
2405 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist
2406 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist
2407 std::string result_str = result->h_name ? result->h_name : "null";
2408 EXPECT_EQ(result_str, "v4only.example.com");
2409 // Check that return address has been mapped from IPv4 to IPv6 address because Netd
2410 // removes NAT64 prefix and does IPv4 DNS reverse lookup in this case. Then, Netd
2411 // fakes the return IPv4 address as original queried IPv6 address.
2412 result_str = ToString(result);
2413 EXPECT_EQ(result_str, "64:ff9b::102:304");
2414 dns.clearQueries();
2415
2416 // Synthesized PTR record exists on DNS server
2417 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
2418 // Expect to Netd pass through synthesized address for DNS queries.
2419 inet_pton(AF_INET6, "64:ff9b::5.6.7.8", &v6addr);
2420 result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2421 ASSERT_TRUE(result != nullptr);
2422 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
2423 result_str = result->h_name ? result->h_name : "null";
2424 EXPECT_EQ(result_str, "v6synthesis.example.com");
2425}
2426
2427TEST_F(ResolverTest, GetHostByAddr_ReverseDns64QueryFromHostFile) {
2428 constexpr char dns64_name[] = "ipv4only.arpa.";
2429 constexpr char host_name[] = "localhost";
2430 // The address is synthesized by prefix64:localhost.
2431 constexpr char host_addr[] = "64:ff9b::7f00:1";
2432
2433 constexpr char listen_addr[] = "::1";
2434 constexpr char listen_srv[] = "53";
2435 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2436 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2437 ASSERT_TRUE(dns.startServer());
2438 const std::vector<std::string> servers = {listen_addr};
2439 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2440 dns.clearQueries();
2441
2442 // Wait for detecting prefix to complete.
2443 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2444
2445 // Using synthesized "localhost" address to be a trick for resolving host name
2446 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
2447 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
2448 struct in6_addr v6addr;
2449 inet_pton(AF_INET6, host_addr, &v6addr);
2450 struct hostent* result = gethostbyaddr(&v6addr, sizeof(v6addr), AF_INET6);
2451 ASSERT_TRUE(result != nullptr);
2452 // Expect no DNS queries; localhost is resolved via /etc/hosts.
2453 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2454
2455 ASSERT_EQ(sizeof(in6_addr), (unsigned) result->h_length);
2456 ASSERT_EQ(AF_INET6, result->h_addrtype);
2457 std::string result_str = ToString(result);
2458 EXPECT_EQ(result_str, host_addr);
2459 result_str = result->h_name ? result->h_name : "null";
2460 EXPECT_EQ(result_str, host_name);
2461}
2462
2463TEST_F(ResolverTest, GetNameInfo_ReverseDnsQueryWithHavingNat64Prefix) {
2464 constexpr char listen_addr[] = "::1";
2465 constexpr char listen_srv[] = "53";
2466 constexpr char dns64_name[] = "ipv4only.arpa.";
2467 constexpr char ptr_name[] = "v4v6.example.com.";
2468 // PTR record for IPv4 address 1.2.3.4
2469 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2470 // PTR record for IPv6 address 2001:db8::102:304
2471 constexpr char ptr_addr_v6[] =
2472 "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.";
2473
2474 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2475 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2476 dns.addMapping(ptr_addr_v4, ns_type::ns_t_ptr, ptr_name);
2477 dns.addMapping(ptr_addr_v6, ns_type::ns_t_ptr, ptr_name);
2478 ASSERT_TRUE(dns.startServer());
2479
2480 const std::vector<std::string> servers = {listen_addr};
2481 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2482 dns.clearQueries();
2483
2484 // Wait for detecting prefix to complete.
2485 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2486
2487 static const struct TestConfig {
2488 int flag;
2489 int family;
2490 std::string addr;
2491 std::string host;
2492
2493 std::string asParameters() const {
2494 return StringPrintf("flag=%d, family=%d, addr=%s, host=%s", flag, family, addr.c_str(),
2495 host.c_str());
2496 }
2497 } testConfigs[]{
2498 {NI_NAMEREQD, AF_INET, "1.2.3.4", "v4v6.example.com"},
2499 {NI_NUMERICHOST, AF_INET, "1.2.3.4", "1.2.3.4"},
2500 {0, AF_INET, "1.2.3.4", "v4v6.example.com"},
2501 {0, AF_INET, "5.6.7.8", "5.6.7.8"}, // unmapped
2502 {NI_NAMEREQD, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
2503 {NI_NUMERICHOST, AF_INET6, "2001:db8::102:304", "2001:db8::102:304"},
2504 {0, AF_INET6, "2001:db8::102:304", "v4v6.example.com"},
2505 {0, AF_INET6, "2001:db8::506:708", "2001:db8::506:708"}, // unmapped
2506 };
2507
2508 // Reverse IPv4/IPv6 DNS query. Prefix should have no effect on it.
2509 for (const auto& config : testConfigs) {
2510 SCOPED_TRACE(config.asParameters());
2511
2512 int rv;
2513 char host[NI_MAXHOST];
2514 struct sockaddr_in sin;
2515 struct sockaddr_in6 sin6;
2516 if (config.family == AF_INET) {
2517 memset(&sin, 0, sizeof(sin));
2518 sin.sin_family = AF_INET;
2519 inet_pton(AF_INET, config.addr.c_str(), &sin.sin_addr);
2520 rv = getnameinfo((const struct sockaddr*) &sin, sizeof(sin), host, sizeof(host),
2521 nullptr, 0, config.flag);
2522 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4));
2523 } else if (config.family == AF_INET6) {
2524 memset(&sin6, 0, sizeof(sin6));
2525 sin6.sin6_family = AF_INET6;
2526 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
2527 rv = getnameinfo((const struct sockaddr*) &sin6, sizeof(sin6), host, sizeof(host),
2528 nullptr, 0, config.flag);
2529 if (config.flag == NI_NAMEREQD) EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6));
2530 }
2531 ASSERT_EQ(0, rv);
2532 std::string result_str = host;
2533 EXPECT_EQ(result_str, config.host);
2534 dns.clearQueries();
2535 }
2536}
2537
2538TEST_F(ResolverTest, GetNameInfo_ReverseDns64Query) {
2539 constexpr char listen_addr[] = "::1";
2540 constexpr char listen_srv[] = "53";
2541 constexpr char dns64_name[] = "ipv4only.arpa.";
2542 constexpr char ptr_name[] = "v4only.example.com.";
2543 // PTR record for IPv4 address 1.2.3.4
2544 constexpr char ptr_addr_v4[] = "4.3.2.1.in-addr.arpa.";
2545 // PTR record for IPv6 address 64:ff9b::1.2.3.4
2546 constexpr char ptr_addr_v6_nomapping[] =
2547 "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.";
2548 constexpr char ptr_name_v6_synthesis[] = "v6synthesis.example.com.";
2549 // PTR record for IPv6 address 64:ff9b::5.6.7.8
2550 constexpr char ptr_addr_v6_synthesis[] =
2551 "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.";
2552
2553 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2554 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2555 dns.addMapping(ptr_addr_v4, ns_type::ns_t_ptr, ptr_name);
2556 dns.addMapping(ptr_addr_v6_synthesis, ns_type::ns_t_ptr, ptr_name_v6_synthesis);
2557 ASSERT_TRUE(dns.startServer());
2558
2559 const std::vector<std::string> servers = {listen_addr};
2560 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2561 dns.clearQueries();
2562
2563 // Wait for detecting prefix to complete.
2564 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2565
2566 static const struct TestConfig {
2567 bool hasSynthesizedPtrRecord;
2568 int flag;
2569 std::string addr;
2570 std::string host;
2571
2572 std::string asParameters() const {
2573 return StringPrintf("hasSynthesizedPtrRecord=%d, flag=%d, addr=%s, host=%s",
2574 hasSynthesizedPtrRecord, flag, addr.c_str(), host.c_str());
2575 }
2576 } testConfigs[]{
2577 {false, NI_NAMEREQD, "64:ff9b::102:304", "v4only.example.com"},
2578 {false, NI_NUMERICHOST, "64:ff9b::102:304", "64:ff9b::102:304"},
2579 {false, 0, "64:ff9b::102:304", "v4only.example.com"},
2580 {true, NI_NAMEREQD, "64:ff9b::506:708", "v6synthesis.example.com"},
2581 {true, NI_NUMERICHOST, "64:ff9b::506:708", "64:ff9b::506:708"},
2582 {true, 0, "64:ff9b::506:708", "v6synthesis.example.com"}
2583 };
2584
2585 // hasSynthesizedPtrRecord = false
2586 // Synthesized PTR record doesn't exist on DNS server
2587 // Reverse IPv6 DNS64 query while DNS server doesn't have an answer for synthesized address.
2588 // After querying synthesized address failed, expect that prefix is removed from IPv6
2589 // synthesized address and do reverse IPv4 query instead.
2590 //
2591 // hasSynthesizedPtrRecord = true
2592 // Synthesized PTR record exists on DNS server
2593 // Reverse IPv6 DNS64 query while DNS server has an answer for synthesized address.
2594 // Expect to just pass through synthesized address for DNS queries.
2595 for (const auto& config : testConfigs) {
2596 SCOPED_TRACE(config.asParameters());
2597
2598 char host[NI_MAXHOST];
2599 struct sockaddr_in6 sin6;
2600 memset(&sin6, 0, sizeof(sin6));
2601 sin6.sin6_family = AF_INET6;
2602 inet_pton(AF_INET6, config.addr.c_str(), &sin6.sin6_addr);
2603 int rv = getnameinfo((const struct sockaddr*) &sin6, sizeof(sin6), host, sizeof(host),
2604 nullptr, 0, config.flag);
2605 ASSERT_EQ(0, rv);
2606 if (config.flag == NI_NAMEREQD) {
2607 if (config.hasSynthesizedPtrRecord) {
2608 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_synthesis));
2609 } else {
2610 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v6_nomapping)); // PTR record not exist.
2611 EXPECT_LE(1U, GetNumQueries(dns, ptr_addr_v4)); // PTR record exist.
2612 }
2613 }
2614 std::string result_str = host;
2615 EXPECT_EQ(result_str, config.host);
2616 dns.clearQueries();
2617 }
2618}
2619
2620TEST_F(ResolverTest, GetNameInfo_ReverseDns64QueryFromHostFile) {
2621 constexpr char dns64_name[] = "ipv4only.arpa.";
2622 constexpr char host_name[] = "localhost";
2623 // The address is synthesized by prefix64:localhost.
2624 constexpr char host_addr[] = "64:ff9b::7f00:1";
2625
2626 constexpr char listen_addr[] = "::1";
2627 constexpr char listen_srv[] = "53";
2628 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2629 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2630 ASSERT_TRUE(dns.startServer());
2631 const std::vector<std::string> servers = {listen_addr};
2632 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2633 dns.clearQueries();
2634
2635 // Wait for detecting prefix to complete.
2636 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2637
2638 // Using synthesized "localhost" address to be a trick for resolving host name
2639 // from host file /etc/hosts and "localhost" is the only name in /etc/hosts. Note that this is
2640 // not realistic: the code never synthesizes AAAA records for addresses in 127.0.0.0/8.
2641 char host[NI_MAXHOST];
2642 struct sockaddr_in6 sin6;
2643 memset(&sin6, 0, sizeof(sin6));
2644 sin6.sin6_family = AF_INET6;
2645 inet_pton(AF_INET6, host_addr, &sin6.sin6_addr);
2646 int rv = getnameinfo((const struct sockaddr*) &sin6, sizeof(sin6), host, sizeof(host), nullptr,
2647 0, NI_NAMEREQD);
2648 ASSERT_EQ(0, rv);
2649 // Expect no DNS queries; localhost is resolved via /etc/hosts.
2650 EXPECT_EQ(0U, GetNumQueries(dns, host_name));
2651
2652 std::string result_str = host;
2653 EXPECT_EQ(result_str, host_name);
2654}
2655
nuccachenf52f7a52018-07-17 18:07:23 +08002656TEST_F(ResolverTest, GetHostByName2_Dns64Synthesize) {
2657 constexpr char dns64_name[] = "ipv4only.arpa.";
2658 constexpr char host_name[] = "ipv4only.example.com.";
2659
2660 constexpr char listen_addr[] = "::1";
2661 constexpr char listen_srv[] = "53";
2662 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2663 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2664 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2665 ASSERT_TRUE(dns.startServer());
2666 const std::vector<std::string> servers = {listen_addr};
2667 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2668 dns.clearQueries();
2669
2670 // Wait for detecting prefix to complete.
2671 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2672
2673 // Query an IPv4-only hostname. Expect that gets a synthesized address.
2674 struct hostent* result = gethostbyname2("ipv4only", AF_INET6);
2675 ASSERT_TRUE(result != nullptr);
2676 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2677 std::string result_str = ToString(result);
2678 EXPECT_EQ(result_str, "64:ff9b::102:304");
2679}
nuccachenf52f7a52018-07-17 18:07:23 +08002680
2681TEST_F(ResolverTest, GetHostByName2_DnsQueryWithHavingNat64Prefix) {
2682 constexpr char dns64_name[] = "ipv4only.arpa.";
2683 constexpr char host_name[] = "v4v6.example.com.";
2684
2685 constexpr char listen_addr[] = "::1";
2686 constexpr char listen_srv[] = "53";
2687 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2688 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::192.0.0.170");
2689 dns.addMapping(host_name, ns_type::ns_t_a, "1.2.3.4");
2690 dns.addMapping(host_name, ns_type::ns_t_aaaa, "2001:db8::1.2.3.4");
2691 ASSERT_TRUE(dns.startServer());
2692 const std::vector<std::string> servers = {listen_addr};
2693 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2694 dns.clearQueries();
2695
2696 // Wait for detecting prefix to complete.
2697 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2698
2699 // IPv4 DNS query. Prefix should have no effect on it.
2700 struct hostent* result = gethostbyname2("v4v6", AF_INET);
2701 ASSERT_TRUE(result != nullptr);
2702 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2703 std::string result_str = ToString(result);
2704 EXPECT_EQ(result_str, "1.2.3.4");
2705 dns.clearQueries();
2706
2707 // IPv6 DNS query. Prefix should have no effect on it.
2708 result = gethostbyname2("v4v6", AF_INET6);
2709 ASSERT_TRUE(result != nullptr);
2710 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2711 result_str = ToString(result);
2712 EXPECT_EQ(result_str, "2001:db8::102:304");
2713}
2714
2715TEST_F(ResolverTest, GetHostByName2_Dns64QuerySpecialUseIPv4Addresses) {
2716 constexpr char THIS_NETWORK[] = "this_network";
2717 constexpr char LOOPBACK[] = "loopback";
2718 constexpr char LINK_LOCAL[] = "link_local";
2719 constexpr char MULTICAST[] = "multicast";
2720 constexpr char LIMITED_BROADCAST[] = "limited_broadcast";
2721
2722 constexpr char ADDR_THIS_NETWORK[] = "0.0.0.1";
2723 constexpr char ADDR_LOOPBACK[] = "127.0.0.1";
2724 constexpr char ADDR_LINK_LOCAL[] = "169.254.0.1";
2725 constexpr char ADDR_MULTICAST[] = "224.0.0.1";
2726 constexpr char ADDR_LIMITED_BROADCAST[] = "255.255.255.255";
2727
2728 constexpr char listen_addr[] = "::1";
2729 constexpr char listen_srv[] = "53";
2730 constexpr char dns64_name[] = "ipv4only.arpa.";
2731
2732 test::DNSResponder dns(listen_addr, listen_srv, 250, ns_rcode::ns_r_servfail);
2733 dns.addMapping(dns64_name, ns_type::ns_t_aaaa, "64:ff9b::");
2734 ASSERT_TRUE(dns.startServer());
2735
2736 const std::vector<std::string> servers = {listen_addr};
2737 ASSERT_TRUE(SetResolversForNetwork(servers, mDefaultSearchDomains, mDefaultParams_Binder));
2738 dns.clearQueries();
2739
2740 // Wait for detecting prefix to complete.
2741 EXPECT_TRUE(WaitForPrefix64Detected(TEST_NETID, 1000));
2742
2743 static const struct TestConfig {
2744 std::string name;
2745 std::string addr;
2746
2747 std::string asHostName() const {
2748 return StringPrintf("%s.example.com.",
2749 name.c_str());
2750 }
2751 } testConfigs[]{
2752 {THIS_NETWORK, ADDR_THIS_NETWORK},
2753 {LOOPBACK, ADDR_LOOPBACK},
2754 {LINK_LOCAL, ADDR_LINK_LOCAL},
2755 {MULTICAST, ADDR_MULTICAST},
2756 {LIMITED_BROADCAST, ADDR_LIMITED_BROADCAST}
2757 };
2758
2759 for (const auto& config : testConfigs) {
2760 const std::string testHostName = config.asHostName();
2761 SCOPED_TRACE(testHostName);
2762
2763 const char* host_name = testHostName.c_str();
2764 dns.addMapping(host_name, ns_type::ns_t_a, config.addr.c_str());
2765
2766 struct hostent* result = gethostbyname2(config.name.c_str(), AF_INET6);
2767 EXPECT_LE(1U, GetNumQueries(dns, host_name));
2768
2769 // In AF_INET6 case, don't synthesize special use IPv4 address.
2770 // Expect to have no answer
2771 EXPECT_EQ(nullptr, result);
2772
2773 dns.clearQueries();
2774 }
2775}