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 #ifdef QOS_MANAGER_ENABLE
25 #include "qos.h"
26 #include "concurrent_task_client.h"
27 #include <sys/resource.h>
28 #endif
29
30 #include "dns_manager.h"
31 #include <netdb.h>
32
33 namespace OHOS {
34 namespace nmd {
35 using namespace OHOS::NetManagerStandard::CommonUtils;
36
StartListen()37 void StartListen()
38 {
39 NETNATIVE_LOG_D("Enter threadStart");
40 #ifdef QOS_MANAGER_ENABLE
41 std::unordered_map<std::string, std::string> payload;
42 payload["pid"] = std::to_string(getpid());
43 OHOS::ConcurrentTask::ConcurrentTaskClient::GetInstance().RequestAuth(payload);
44 if (SetThreadQos(QOS::QosLevel::QOS_USER_INITIATED) != 0) {
45 setpriority(PRIO_PROCESS, 0, PRIO_MIN);
46 }
47 NETNATIVE_LOGI("DnsMgerListen set qos end");
48 #endif
49 DnsResolvListen().StartListen();
50 }
51
DnsManager()52 DnsManager::DnsManager() : dnsProxyListen_(std::make_shared<DnsProxyListen>())
53 {
54 std::thread t(StartListen);
55 std::string threadName = "DnsMgerListen";
56 pthread_setname_np(t.native_handle(), threadName.c_str());
57 t.detach();
58 }
59
EnableIpv6(uint16_t netId,std::string & destination,const std::string & nextHop)60 void DnsManager::EnableIpv6(uint16_t netId, std::string &destination, const std::string &nextHop)
61 {
62 auto pos = destination.find("/");
63 if (pos != std::string::npos) {
64 destination = destination.substr(0, pos);
65 }
66 if (!(IsValidIPV6(destination) && (IsValidIPV6(nextHop) || nextHop.empty()))) {
67 NETNATIVE_LOGE("check IsValidIPV6 faild");
68 return;
69 }
70 DnsParamCache::GetInstance().EnableIpv6(netId);
71 }
72
SetResolverConfig(uint16_t netId,uint16_t baseTimeoutMillis,uint8_t retryCount,const std::vector<std::string> & servers,const std::vector<std::string> & domains)73 int32_t DnsManager::SetResolverConfig(uint16_t netId, uint16_t baseTimeoutMillis, uint8_t retryCount,
74 const std::vector<std::string> &servers, const std::vector<std::string> &domains)
75 {
76 NETNATIVE_LOG_D("manager_SetResolverConfig netId[%{public}d]", netId);
77 return DnsParamCache::GetInstance().SetResolverConfig(netId, baseTimeoutMillis, retryCount, servers, domains);
78 }
79
GetResolverConfig(uint16_t netId,std::vector<std::string> & servers,std::vector<std::string> & domains,uint16_t & baseTimeoutMillis,uint8_t & retryCount)80 int32_t DnsManager::GetResolverConfig(uint16_t netId, std::vector<std::string> &servers,
81 std::vector<std::string> &domains, uint16_t &baseTimeoutMillis,
82 uint8_t &retryCount)
83 {
84 NETNATIVE_LOG_D("manager_GetResolverConfig netId[%{public}d]", netId);
85 return DnsParamCache::GetInstance().GetResolverConfig(netId, servers, domains, baseTimeoutMillis, retryCount);
86 }
87
CreateNetworkCache(uint16_t netId,bool isVpnNet)88 int32_t DnsManager::CreateNetworkCache(uint16_t netId, bool isVpnNet)
89 {
90 NETNATIVE_LOG_D("manager_CreateNetworkCache netId[%{public}d]", netId);
91 return DnsParamCache::GetInstance().CreateCacheForNet(netId, isVpnNet);
92 }
93
DestroyNetworkCache(uint16_t netId,bool isVpnNet)94 int32_t DnsManager::DestroyNetworkCache(uint16_t netId, bool isVpnNet)
95 {
96 return DnsParamCache::GetInstance().DestroyNetworkCache(netId, isVpnNet);
97 }
98
SetDefaultNetwork(uint16_t netId)99 void DnsManager::SetDefaultNetwork(uint16_t netId)
100 {
101 DnsParamCache::GetInstance().SetDefaultNetwork(netId);
102 }
103
StartProxyListen()104 void StartProxyListen()
105 {
106 NETNATIVE_LOG_D("begin StartProxyListen");
107 DnsProxyListen().StartListen();
108 }
109
ShareDnsSet(uint16_t netId)110 void DnsManager::ShareDnsSet(uint16_t netId)
111 {
112 dnsProxyListen_->SetParseNetId(netId);
113 }
114
StartDnsProxyListen()115 void DnsManager::StartDnsProxyListen()
116 {
117 dnsProxyListen_->OnListen();
118 std::thread t(StartProxyListen);
119 std::string threadName = "DnsPxyListen";
120 pthread_setname_np(t.native_handle(), threadName.c_str());
121 t.detach();
122 }
123
StopDnsProxyListen()124 void DnsManager::StopDnsProxyListen()
125 {
126 dnsProxyListen_->OffListen();
127 }
128
GetDumpInfo(std::string & info)129 void DnsManager::GetDumpInfo(std::string &info)
130 {
131 NETNATIVE_LOG_D("Get dump info");
132 DnsParamCache::GetInstance().GetDumpInfo(info);
133 }
134
GetAddrInfo(const std::string & hostName,const std::string & serverName,const AddrInfo & hints,uint16_t netId,std::vector<AddrInfo> & res)135 int32_t DnsManager::GetAddrInfo(const std::string &hostName, const std::string &serverName, const AddrInfo &hints,
136 uint16_t netId, std::vector<AddrInfo> &res)
137 {
138 if (netId == 0) {
139 netId = DnsParamCache::GetInstance().GetDefaultNetwork();
140 NETNATIVE_LOG_D("DnsManager DnsGetaddrinfo netId == 0 defaultNetId_ : %{public}d", netId);
141 }
142 struct addrinfo hint = {};
143 struct addrinfo *result;
144 struct queryparam qparam = {};
145
146 if ((hostName.size() == 0) && (serverName.size() == 0)) {
147 return -1;
148 }
149
150 qparam.qp_netid = netId;
151 qparam.qp_type = 1;
152
153 hint.ai_family = hints.aiFamily;
154 hint.ai_flags = hints.aiFlags;
155 hint.ai_protocol = hints.aiProtocol;
156 hint.ai_socktype = hints.aiSockType;
157
158 int32_t ret = getaddrinfo_ext(((hostName.size() == 0) ? NULL : hostName.c_str()),
159 ((serverName.size() == 0) ? NULL : serverName.c_str()),
160 &hint, &result, &qparam);
161 if (ret == 0) {
162 ret = FillAddrInfo(res, result);
163 freeaddrinfo(result);
164 }
165
166 return ret;
167 }
168
RegisterDnsResultCallback(const sptr<NetsysNative::INetDnsResultCallback> & callback,uint32_t timeStep)169 int32_t DnsManager::RegisterDnsResultCallback(const sptr<NetsysNative::INetDnsResultCallback> &callback,
170 uint32_t timeStep)
171 {
172 return DnsQualityDiag::GetInstance().RegisterResultListener(callback, timeStep);
173 }
174
UnregisterDnsResultCallback(const sptr<NetsysNative::INetDnsResultCallback> & callback)175 int32_t DnsManager::UnregisterDnsResultCallback(const sptr<NetsysNative::INetDnsResultCallback> &callback)
176 {
177 return DnsQualityDiag::GetInstance().UnregisterResultListener(callback);
178 }
179
RegisterDnsHealthCallback(const sptr<NetsysNative::INetDnsHealthCallback> & callback)180 int32_t DnsManager::RegisterDnsHealthCallback(const sptr<NetsysNative::INetDnsHealthCallback> &callback)
181 {
182 return DnsQualityDiag::GetInstance().RegisterHealthListener(callback);
183 }
184
UnregisterDnsHealthCallback(const sptr<NetsysNative::INetDnsHealthCallback> & callback)185 int32_t DnsManager::UnregisterDnsHealthCallback(const sptr<NetsysNative::INetDnsHealthCallback> &callback)
186 {
187 return DnsQualityDiag::GetInstance().UnregisterHealthListener(callback);
188 }
189
AddUidRange(int32_t netId,const std::vector<NetManagerStandard::UidRange> & uidRanges)190 int32_t DnsManager::AddUidRange(int32_t netId, const std::vector<NetManagerStandard::UidRange> &uidRanges)
191 {
192 NETNATIVE_LOG_D("DnsManager::AddUidRange");
193 return DnsParamCache::GetInstance().AddUidRange(netId, uidRanges);
194 }
195
DelUidRange(int32_t netId,const std::vector<NetManagerStandard::UidRange> & uidRanges)196 int32_t DnsManager::DelUidRange(int32_t netId, const std::vector<NetManagerStandard::UidRange> &uidRanges)
197 {
198 NETNATIVE_LOG_D("DnsManager::DelUidRange");
199 return DnsParamCache::GetInstance().DelUidRange(netId, uidRanges);
200 }
201
FillAddrInfo(std::vector<AddrInfo> & addrInfo,addrinfo * res)202 int32_t DnsManager::FillAddrInfo(std::vector<AddrInfo> &addrInfo, addrinfo *res)
203 {
204 int32_t resNum = 0;
205 addrinfo *tmp = res;
206
207 while (tmp) {
208 AddrInfo info;
209 info.aiFlags = static_cast<int32_t>(tmp->ai_flags);
210 info.aiFamily = static_cast<int32_t>(tmp->ai_family);
211 info.aiSockType = static_cast<int32_t>(tmp->ai_socktype);
212 info.aiProtocol = static_cast<int32_t>(tmp->ai_protocol);
213 info.aiAddrLen = tmp->ai_addrlen;
214 if (memcpy_s(&info.aiAddr, sizeof(info.aiAddr), tmp->ai_addr, tmp->ai_addrlen) != 0) {
215 NETNATIVE_LOGE("memcpy_s failed");
216 }
217 if (strcpy_s(info.aiCanonName, sizeof(info.aiCanonName), tmp->ai_canonname) != 0) {
218 NETNATIVE_LOGE("strcpy_s failed");
219 }
220
221 ++resNum;
222 addrInfo.emplace_back(info);
223 tmp = tmp->ai_next;
224 if (resNum >= MAX_RESULTS) {
225 break;
226 }
227 }
228 NETNATIVE_LOGI("FillAddrInfo %{public}d", resNum);
229 return 0;
230 }
231
232 #ifdef FEATURE_NET_FIREWALL_ENABLE
SetFirewallDefaultAction(FirewallRuleAction inDefault,FirewallRuleAction outDefault)233 int32_t DnsManager::SetFirewallDefaultAction(FirewallRuleAction inDefault, FirewallRuleAction outDefault)
234 {
235 return DnsParamCache::GetInstance().SetFirewallDefaultAction(inDefault, outDefault);
236 }
237
SetFirewallCurrentUserId(int32_t userId)238 int32_t DnsManager::SetFirewallCurrentUserId(int32_t userId)
239 {
240 return DnsParamCache::GetInstance().SetFirewallCurrentUserId(userId);
241 }
242
SetFirewallRules(NetFirewallRuleType type,const std::vector<sptr<NetFirewallBaseRule>> & ruleList,bool isFinish)243 int32_t DnsManager::SetFirewallRules(NetFirewallRuleType type, const std::vector<sptr<NetFirewallBaseRule>> &ruleList,
244 bool isFinish)
245 {
246 return DnsParamCache::GetInstance().SetFirewallRules(type, ruleList, isFinish);
247 }
248
ClearFirewallRules(NetFirewallRuleType type)249 int32_t DnsManager::ClearFirewallRules(NetFirewallRuleType type)
250 {
251 return DnsParamCache::GetInstance().ClearFirewallRules(type);
252 }
253
RegisterNetFirewallCallback(const sptr<NetsysNative::INetFirewallCallback> & callback)254 int32_t DnsManager::RegisterNetFirewallCallback(const sptr<NetsysNative::INetFirewallCallback> &callback)
255 {
256 return DnsParamCache::GetInstance().RegisterNetFirewallCallback(callback);
257 }
UnRegisterNetFirewallCallback(const sptr<NetsysNative::INetFirewallCallback> & callback)258 int32_t DnsManager::UnRegisterNetFirewallCallback(const sptr<NetsysNative::INetFirewallCallback> &callback)
259 {
260 return DnsParamCache::GetInstance().UnRegisterNetFirewallCallback(callback);
261 }
262 #endif
263
SetUserDefinedServerFlag(uint16_t netId,bool flag)264 int32_t DnsManager::SetUserDefinedServerFlag(uint16_t netId, bool flag)
265 {
266 NETNATIVE_LOGI("manager_SetUserDefinedServerFlag netId[%{public}d] flag[%{public}d]", netId, flag);
267 return DnsParamCache::GetInstance().SetUserDefinedServerFlag(netId, flag);
268 }
269 } // namespace nmd
270 } // namespace OHOS
271