1 /*
2 * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <pthread.h>
17 #include <thread>
18
19 #include "dns_resolv_listen.h"
20 #include "netmanager_base_common_utils.h"
21 #include "netnative_log_wrapper.h"
22 #include "singleton.h"
23 #include "dns_quality_diag.h"
24
25 #include "dns_manager.h"
26 #include <netdb.h>
27
28 namespace OHOS {
29 namespace nmd {
30 using namespace OHOS::NetManagerStandard::CommonUtils;
31
StartListen()32 void StartListen()
33 {
34 NETNATIVE_LOG_D("Enter threadStart");
35 DnsResolvListen().StartListen();
36 }
37
DnsManager()38 DnsManager::DnsManager() : dnsProxyListen_(std::make_shared<DnsProxyListen>())
39 {
40 std::thread t(StartListen);
41 std::string threadName = "DnsMgerListen";
42 pthread_setname_np(t.native_handle(), threadName.c_str());
43 t.detach();
44 }
45
EnableIpv6(uint16_t netId,std::string & destination,const std::string & nextHop)46 void DnsManager::EnableIpv6(uint16_t netId, std::string &destination, const std::string &nextHop)
47 {
48 auto pos = destination.find("/");
49 if (pos != std::string::npos) {
50 destination = destination.substr(0, pos);
51 }
52 if (!(IsValidIPV6(destination) && (IsValidIPV6(nextHop) || nextHop.empty()))) {
53 NETNATIVE_LOGE("check IsValidIPV6 faild");
54 return;
55 }
56 DnsParamCache::GetInstance().EnableIpv6(netId);
57 }
58
SetResolverConfig(uint16_t netId,uint16_t baseTimeoutMillis,uint8_t retryCount,const std::vector<std::string> & servers,const std::vector<std::string> & domains)59 int32_t DnsManager::SetResolverConfig(uint16_t netId, uint16_t baseTimeoutMillis, uint8_t retryCount,
60 const std::vector<std::string> &servers, const std::vector<std::string> &domains)
61 {
62 NETNATIVE_LOG_D("manager_SetResolverConfig netId[%{public}d]", netId);
63 return DnsParamCache::GetInstance().SetResolverConfig(netId, baseTimeoutMillis, retryCount, servers, domains);
64 }
65
GetResolverConfig(uint16_t netId,std::vector<std::string> & servers,std::vector<std::string> & domains,uint16_t & baseTimeoutMillis,uint8_t & retryCount)66 int32_t DnsManager::GetResolverConfig(uint16_t netId, std::vector<std::string> &servers,
67 std::vector<std::string> &domains, uint16_t &baseTimeoutMillis,
68 uint8_t &retryCount)
69 {
70 NETNATIVE_LOG_D("manager_GetResolverConfig netId[%{public}d]", netId);
71 return DnsParamCache::GetInstance().GetResolverConfig(netId, servers, domains, baseTimeoutMillis, retryCount);
72 }
73
CreateNetworkCache(uint16_t netId)74 int32_t DnsManager::CreateNetworkCache(uint16_t netId)
75 {
76 NETNATIVE_LOG_D("manager_CreateNetworkCache netId[%{public}d]", netId);
77 return DnsParamCache::GetInstance().CreateCacheForNet(netId);
78 }
79
DestroyNetworkCache(uint16_t netId)80 int32_t DnsManager::DestroyNetworkCache(uint16_t netId)
81 {
82 return DnsParamCache::GetInstance().DestroyNetworkCache(netId);
83 }
84
SetDefaultNetwork(uint16_t netId)85 void DnsManager::SetDefaultNetwork(uint16_t netId)
86 {
87 DnsParamCache::GetInstance().SetDefaultNetwork(netId);
88 }
89
StartProxyListen()90 void StartProxyListen()
91 {
92 NETNATIVE_LOG_D("begin StartProxyListen");
93 DnsProxyListen().StartListen();
94 }
95
ShareDnsSet(uint16_t netId)96 void DnsManager::ShareDnsSet(uint16_t netId)
97 {
98 dnsProxyListen_->SetParseNetId(netId);
99 }
100
StartDnsProxyListen()101 void DnsManager::StartDnsProxyListen()
102 {
103 dnsProxyListen_->OnListen();
104 std::thread t(StartProxyListen);
105 std::string threadName = "DnsPxyListen";
106 pthread_setname_np(t.native_handle(), threadName.c_str());
107 t.detach();
108 }
109
StopDnsProxyListen()110 void DnsManager::StopDnsProxyListen()
111 {
112 dnsProxyListen_->OffListen();
113 }
114
GetDumpInfo(std::string & info)115 void DnsManager::GetDumpInfo(std::string &info)
116 {
117 NETNATIVE_LOG_D("Get dump info");
118 DnsParamCache::GetInstance().GetDumpInfo(info);
119 }
120
GetAddrInfo(const std::string & hostName,const std::string & serverName,const AddrInfo & hints,uint16_t netId,std::vector<AddrInfo> & res)121 int32_t DnsManager::GetAddrInfo(const std::string &hostName, const std::string &serverName, const AddrInfo &hints,
122 uint16_t netId, std::vector<AddrInfo> &res)
123 {
124 if (netId == 0) {
125 netId = DnsParamCache::GetInstance().GetDefaultNetwork();
126 NETNATIVE_LOG_D("DnsManager DnsGetaddrinfo netId == 0 defaultNetId_ : %{public}d", netId);
127 }
128 struct addrinfo hint = {};
129 struct addrinfo *result;
130 struct queryparam qparam = {};
131
132 if ((hostName.size() == 0) && (serverName.size() == 0)) {
133 return -1;
134 }
135
136 qparam.qp_netid = netId;
137 qparam.qp_type = 1;
138
139 hint.ai_family = hints.aiFamily;
140 hint.ai_flags = hints.aiFlags;
141 hint.ai_protocol = hints.aiProtocol;
142 hint.ai_socktype = hints.aiSockType;
143
144 int32_t ret = getaddrinfo_ext(((hostName.size() == 0) ? NULL : hostName.c_str()),
145 ((serverName.size() == 0) ? NULL : serverName.c_str()),
146 &hint, &result, &qparam);
147 if (ret == 0) {
148 ret = FillAddrInfo(res, result);
149 freeaddrinfo(result);
150 }
151
152 return ret;
153 }
154
RegisterDnsResultCallback(const sptr<NetsysNative::INetDnsResultCallback> & callback,uint32_t timeStep)155 int32_t DnsManager::RegisterDnsResultCallback(const sptr<NetsysNative::INetDnsResultCallback> &callback,
156 uint32_t timeStep)
157 {
158 return DnsQualityDiag::GetInstance().RegisterResultListener(callback, timeStep);
159 }
160
UnregisterDnsResultCallback(const sptr<NetsysNative::INetDnsResultCallback> & callback)161 int32_t DnsManager::UnregisterDnsResultCallback(const sptr<NetsysNative::INetDnsResultCallback> &callback)
162 {
163 return DnsQualityDiag::GetInstance().UnregisterResultListener(callback);
164 }
165
RegisterDnsHealthCallback(const sptr<NetsysNative::INetDnsHealthCallback> & callback)166 int32_t DnsManager::RegisterDnsHealthCallback(const sptr<NetsysNative::INetDnsHealthCallback> &callback)
167 {
168 return DnsQualityDiag::GetInstance().RegisterHealthListener(callback);
169 }
170
UnregisterDnsHealthCallback(const sptr<NetsysNative::INetDnsHealthCallback> & callback)171 int32_t DnsManager::UnregisterDnsHealthCallback(const sptr<NetsysNative::INetDnsHealthCallback> &callback)
172 {
173 return DnsQualityDiag::GetInstance().UnregisterHealthListener(callback);
174 }
175
AddUidRange(int32_t netId,const std::vector<NetManagerStandard::UidRange> & uidRanges)176 int32_t DnsManager::AddUidRange(int32_t netId, const std::vector<NetManagerStandard::UidRange> &uidRanges)
177 {
178 NETNATIVE_LOG_D("DnsManager::AddUidRange");
179 return DnsParamCache::GetInstance().AddUidRange(netId, uidRanges);
180 }
181
DelUidRange(int32_t netId,const std::vector<NetManagerStandard::UidRange> & uidRanges)182 int32_t DnsManager::DelUidRange(int32_t netId, const std::vector<NetManagerStandard::UidRange> &uidRanges)
183 {
184 NETNATIVE_LOG_D("DnsManager::DelUidRange");
185 return DnsParamCache::GetInstance().DelUidRange(netId, uidRanges);
186 }
187
FillAddrInfo(std::vector<AddrInfo> & addrInfo,addrinfo * res)188 int32_t DnsManager::FillAddrInfo(std::vector<AddrInfo> &addrInfo, addrinfo *res)
189 {
190 int32_t resNum = 0;
191 addrinfo *tmp = res;
192
193 while (tmp) {
194 AddrInfo info;
195 info.aiFlags = static_cast<int32_t>(tmp->ai_flags);
196 info.aiFamily = static_cast<int32_t>(tmp->ai_family);
197 info.aiSockType = static_cast<int32_t>(tmp->ai_socktype);
198 info.aiProtocol = static_cast<int32_t>(tmp->ai_protocol);
199 info.aiAddrLen = tmp->ai_addrlen;
200 if (memcpy_s(&info.aiAddr, sizeof(info.aiAddr), tmp->ai_addr, tmp->ai_addrlen) != 0) {
201 NETNATIVE_LOGE("memcpy_s failed");
202 }
203 if (strcpy_s(info.aiCanonName, sizeof(info.aiCanonName), tmp->ai_canonname) != 0) {
204 NETNATIVE_LOGE("strcpy_s failed");
205 }
206
207 ++resNum;
208 addrInfo.emplace_back(info);
209 tmp = tmp->ai_next;
210 if (resNum >= MAX_RESULTS) {
211 break;
212 }
213 }
214 NETNATIVE_LOGI("FillAddrInfo %{public}d", resNum);
215 return 0;
216 }
217
218 #ifdef FEATURE_NET_FIREWALL_ENABLE
SetFirewallDefaultAction(FirewallRuleAction inDefault,FirewallRuleAction outDefault)219 int32_t DnsManager::SetFirewallDefaultAction(FirewallRuleAction inDefault, FirewallRuleAction outDefault)
220 {
221 return DnsParamCache::GetInstance().SetFirewallDefaultAction(inDefault, outDefault);
222 }
223
SetFirewallCurrentUserId(int32_t userId)224 int32_t DnsManager::SetFirewallCurrentUserId(int32_t userId)
225 {
226 return DnsParamCache::GetInstance().SetFirewallCurrentUserId(userId);
227 }
228
SetFirewallRules(NetFirewallRuleType type,const std::vector<sptr<NetFirewallBaseRule>> & ruleList,bool isFinish)229 int32_t DnsManager::SetFirewallRules(NetFirewallRuleType type, const std::vector<sptr<NetFirewallBaseRule>> &ruleList,
230 bool isFinish)
231 {
232 return DnsParamCache::GetInstance().SetFirewallRules(type, ruleList, isFinish);
233 }
234
ClearFirewallRules(NetFirewallRuleType type)235 int32_t DnsManager::ClearFirewallRules(NetFirewallRuleType type)
236 {
237 return DnsParamCache::GetInstance().ClearFirewallRules(type);
238 }
239
RegisterNetFirewallCallback(const sptr<NetsysNative::INetFirewallCallback> & callback)240 int32_t DnsManager::RegisterNetFirewallCallback(const sptr<NetsysNative::INetFirewallCallback> &callback)
241 {
242 return DnsParamCache::GetInstance().RegisterNetFirewallCallback(callback);
243 }
UnRegisterNetFirewallCallback(const sptr<NetsysNative::INetFirewallCallback> & callback)244 int32_t DnsManager::UnRegisterNetFirewallCallback(const sptr<NetsysNative::INetFirewallCallback> &callback)
245 {
246 return DnsParamCache::GetInstance().UnRegisterNetFirewallCallback(callback);
247 }
248 #endif
249 } // namespace nmd
250 } // namespace OHOS
251