• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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