• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2019 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 
18 #pragma once
19 
20 #include <memory>
21 #include <string>
22 #include <vector>
23 
24 #include <android-base/format.h>
25 #include <android-base/logging.h>
26 #include <android-base/result.h>
27 
28 #include <aidl/android/net/IDnsResolver.h>
29 #include <aidl/android/net/INetd.h>
30 #include "ResolverStats.h"  // TODO: stop depending on this internal header
31 #include "dns_responder.h"
32 #include "dns_tls_certificate.h"
33 #include "params.h"
34 
35 using aidl::android::net::NativeNetworkConfig;
36 using aidl::android::net::NativeNetworkType;
37 using aidl::android::net::NativeVpnType;
38 
39 inline constexpr char kDefaultServer[] = "127.0.0.3";
40 inline constexpr char kDefaultSearchDomain[] = "example.com";
41 
42 #define SKIP_IF_REMOTE_VERSION_LESS_THAN(service, version)                                         \
43     do {                                                                                           \
44         if (!DnsResponderClient::isRemoteVersionSupported(service, version)) {                     \
45             std::cerr << "    Skip test. Remote version is too old, required version: " << version \
46                       << std::endl;                                                                \
47             return;                                                                                \
48         }                                                                                          \
49     } while (0)
50 
51 // A thin wrapper to store the outputs of DnsResolver::getResolverInfo().
52 struct ResolverInfo {
53     std::vector<std::string> dnsServers;
54     std::vector<std::string> domains;
55     std::vector<std::string> dotServers;
56     res_params params;
57     std::vector<android::net::ResolverStats> stats;
58     int waitForPendingReqTimeoutCount;
59 };
60 
61 class ResolverParams {
62   public:
63     class Builder {
64       public:
65         Builder();
setDnsServers(const std::vector<std::string> & servers)66         constexpr Builder& setDnsServers(const std::vector<std::string>& servers) {
67             mParcel.servers = servers;
68             return *this;
69         }
setDotServers(const std::vector<std::string> & servers)70         constexpr Builder& setDotServers(const std::vector<std::string>& servers) {
71             mParcel.tlsServers = servers;
72             return *this;
73         }
setDomains(const std::vector<std::string> & domains)74         constexpr Builder& setDomains(const std::vector<std::string>& domains) {
75             mParcel.domains = domains;
76             return *this;
77         }
setPrivateDnsProvider(const std::string & provider)78         constexpr Builder& setPrivateDnsProvider(const std::string& provider) {
79             mParcel.tlsName = provider;
80             return *this;
81         }
setParams(const std::array<int,aidl::android::net::IDnsResolver::RESOLVER_PARAMS_COUNT> & params)82         constexpr Builder& setParams(
83                 const std::array<int, aidl::android::net::IDnsResolver::RESOLVER_PARAMS_COUNT>&
84                         params) {
85             using aidl::android::net::IDnsResolver;
86             mParcel.sampleValiditySeconds = params[IDnsResolver::RESOLVER_PARAMS_SAMPLE_VALIDITY];
87             mParcel.successThreshold = params[IDnsResolver::RESOLVER_PARAMS_SUCCESS_THRESHOLD];
88             mParcel.minSamples = params[IDnsResolver::RESOLVER_PARAMS_MIN_SAMPLES];
89             mParcel.maxSamples = params[IDnsResolver::RESOLVER_PARAMS_MAX_SAMPLES];
90             mParcel.baseTimeoutMsec = params[IDnsResolver::RESOLVER_PARAMS_BASE_TIMEOUT_MSEC];
91             mParcel.retryCount = params[IDnsResolver::RESOLVER_PARAMS_RETRY_COUNT];
92             return *this;
93         }
build()94         aidl::android::net::ResolverParamsParcel build() { return mParcel; }
95 
96       private:
97         aidl::android::net::ResolverParamsParcel mParcel;
98     };
99 };
100 
101 // TODO: Remove dns_responder_client_ndk.{h,cpp} after replacing the binder usage of
102 // dns_responder_client.*
103 class DnsResponderClient {
104   public:
105     struct Mapping {
106         std::string host;
107         std::string entry;
108         std::string ip4;
109         std::string ip6;
110     };
111 
112     virtual ~DnsResponderClient() = default;
113 
114     static void SetupMappings(unsigned num_hosts, const std::vector<std::string>& domains,
115                               std::vector<Mapping>* mappings);
116 
117     // For dns_benchmark built from tm-mainline-prod.
118     // TODO: Remove it when possible.
119     bool SetResolversForNetwork(const std::vector<std::string>& servers,
120                                 const std::vector<std::string>& domains, std::vector<int> params);
121 
122     // Sets up DnsResolver with given DNS servers. This is used to set up for private DNS off mode.
123     bool SetResolversForNetwork(const std::vector<std::string>& servers = {kDefaultServer},
124                                 const std::vector<std::string>& domains = {kDefaultSearchDomain});
125 
126     // Sets up DnsResolver from a given parcel.
127     bool SetResolversFromParcel(const aidl::android::net::ResolverParamsParcel& resolverParams);
128 
129     template <class T>
isRemoteVersionSupported(T remoteService,int requiredVersion)130     static bool isRemoteVersionSupported(T remoteService, int requiredVersion) {
131         int remoteVersion = 0;
132         if (!remoteService->getInterfaceVersion(&remoteVersion).isOk()) {
133             LOG(FATAL) << "Can't get remote version";
134         }
135         if (remoteVersion < requiredVersion) {
136             LOG(WARNING) << fmt::format("Remote version: {} < Required version: {}", remoteVersion,
137                                         requiredVersion);
138             return false;
139         }
140         return true;
141     };
142 
143     static NativeNetworkConfig makeNativeNetworkConfig(int netId, NativeNetworkType networkType,
144                                                        int permission, bool secure);
145 
146     android::base::Result<ResolverInfo> getResolverInfo();
147 
148     // Return a default resolver configuration for opportunistic mode.
149     static aidl::android::net::ResolverParamsParcel GetDefaultResolverParamsParcel();
150 
151     static void SetupDNSServers(unsigned numServers, const std::vector<Mapping>& mappings,
152                                 std::vector<std::unique_ptr<test::DNSResponder>>* dns,
153                                 std::vector<std::string>* servers);
154 
155     // Returns 0 on success and a negative value on failure.
156     int SetupOemNetwork(int oemNetId);
157     int TearDownOemNetwork(int oemNetId);
158 
159     virtual void SetUp();
160     virtual void TearDown();
161 
resolvService()162     aidl::android::net::IDnsResolver* resolvService() const { return mDnsResolvSrv.get(); }
netdService()163     aidl::android::net::INetd* netdService() const { return mNetdSrv.get(); }
164 
165   private:
166     std::shared_ptr<aidl::android::net::INetd> mNetdSrv;
167     std::shared_ptr<aidl::android::net::IDnsResolver> mDnsResolvSrv;
168 };
169