1 /*
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 required 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 #define LOG_TAG "dns_responder_client"
18 #include "dns_responder_client.h"
19 
20 #include <android-base/stringprintf.h>
21 #include <utils/Log.h>
22 
23 // TODO: make this dynamic and stop depending on implementation details.
24 #define TEST_OEM_NETWORK "oem29"
25 #define TEST_NETID 30
26 
27 // TODO: move this somewhere shared.
28 static const char* ANDROID_DNS_MODE = "ANDROID_DNS_MODE";
29 
30 using android::base::StringPrintf;
31 
SetupMappings(unsigned num_hosts,const std::vector<std::string> & domains,std::vector<Mapping> * mappings)32 void DnsResponderClient::SetupMappings(unsigned num_hosts, const std::vector<std::string>& domains,
33         std::vector<Mapping>* mappings) {
34     mappings->resize(num_hosts * domains.size());
35     auto mappings_it = mappings->begin();
36     for (unsigned i = 0 ; i < num_hosts ; ++i) {
37         for (const auto& domain : domains) {
38             mappings_it->host = StringPrintf("host%u", i);
39             mappings_it->entry = StringPrintf("%s.%s.", mappings_it->host.c_str(),
40                     domain.c_str());
41             mappings_it->ip4 = StringPrintf("192.0.2.%u", i%253 + 1);
42             mappings_it->ip6 = StringPrintf("2001:db8::%x", i%65534 + 1);
43             ++mappings_it;
44         }
45     }
46 }
47 
SetResolversForNetwork(const std::vector<std::string> & servers,const std::vector<std::string> & domains,const std::vector<int> & params)48 bool DnsResponderClient::SetResolversForNetwork(const std::vector<std::string>& servers,
49         const std::vector<std::string>& domains, const std::vector<int>& params) {
50     const auto rv = mNetdSrv->setResolverConfiguration(TEST_NETID, servers, domains, params,
51             "", {}, {});
52     return rv.isOk();
53 }
54 
SetResolversWithTls(const std::vector<std::string> & servers,const std::vector<std::string> & domains,const std::vector<int> & params,const std::vector<std::string> & tlsServers,const std::string & name,const std::vector<std::string> & fingerprints)55 bool DnsResponderClient::SetResolversWithTls(const std::vector<std::string>& servers,
56         const std::vector<std::string>& domains, const std::vector<int>& params,
57         const std::vector<std::string>& tlsServers,
58         const std::string& name, const std::vector<std::string>& fingerprints) {
59     const auto rv = mNetdSrv->setResolverConfiguration(TEST_NETID, servers, domains, params,
60             name, tlsServers, fingerprints);
61     if (!rv.isOk()) ALOGI("SetResolversWithTls() -> %s", rv.toString8().c_str());
62     return rv.isOk();
63 }
64 
SetupDNSServers(unsigned num_servers,const std::vector<Mapping> & mappings,std::vector<std::unique_ptr<test::DNSResponder>> * dns,std::vector<std::string> * servers)65 void DnsResponderClient::SetupDNSServers(unsigned num_servers, const std::vector<Mapping>& mappings,
66         std::vector<std::unique_ptr<test::DNSResponder>>* dns,
67         std::vector<std::string>* servers) {
68     const char* listen_srv = "53";
69     dns->resize(num_servers);
70     servers->resize(num_servers);
71     for (unsigned i = 0 ; i < num_servers ; ++i) {
72         auto& server = (*servers)[i];
73         auto& d = (*dns)[i];
74         server = StringPrintf("127.0.0.%u", i + 100);
75         d = std::make_unique<test::DNSResponder>(server, listen_srv, 250,
76                 ns_rcode::ns_r_servfail, 1.0);
77         for (const auto& mapping : mappings) {
78             d->addMapping(mapping.entry.c_str(), ns_type::ns_t_a, mapping.ip4.c_str());
79             d->addMapping(mapping.entry.c_str(), ns_type::ns_t_aaaa, mapping.ip6.c_str());
80         }
81         d->startServer();
82     }
83 }
84 
ShutdownDNSServers(std::vector<std::unique_ptr<test::DNSResponder>> * dns)85 void DnsResponderClient::ShutdownDNSServers(std::vector<std::unique_ptr<test::DNSResponder>>* dns) {
86     for (const auto& d : *dns) {
87         d->stopServer();
88     }
89     dns->clear();
90 }
91 
SetupOemNetwork()92 int DnsResponderClient::SetupOemNetwork() {
93     mNetdSrv->networkDestroy(TEST_NETID);
94     auto ret = mNetdSrv->networkCreatePhysical(TEST_NETID, "");
95     if (!ret.isOk()) {
96         fprintf(stderr, "Creating physical network %d failed, %s\n", TEST_NETID,
97                 ret.toString8().string());
98         return -1;
99     }
100     int oemNetId = TEST_NETID;
101     setNetworkForProcess(oemNetId);
102     if ((unsigned) oemNetId != getNetworkForProcess()) {
103         return -1;
104     }
105     return oemNetId;
106 }
107 
TearDownOemNetwork(int oemNetId)108 void DnsResponderClient::TearDownOemNetwork(int oemNetId) {
109     if (oemNetId != -1) {
110         mNetdSrv->networkDestroy(oemNetId);
111     }
112 }
113 
SetUp()114 void DnsResponderClient::SetUp() {
115     // binder setup
116     auto binder = android::defaultServiceManager()->getService(android::String16("netd"));
117     mNetdSrv = android::interface_cast<android::net::INetd>(binder);
118 
119     // Ensure resolutions go via proxy.
120     setenv(ANDROID_DNS_MODE, "", 1);
121     mOemNetId = SetupOemNetwork();
122 }
123 
TearDown()124 void DnsResponderClient::TearDown() {
125     TearDownOemNetwork(mOemNetId);
126 }
127