1 /*
2  * Copyright (c) 2021-2024 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 "mock_netsys_native_client.h"
17 
18 #include <ctime>
19 #include <dirent.h>
20 #include <sys/ioctl.h>
21 #include <sys/types.h>
22 #include <sys/stat.h>
23 #include <fcntl.h>
24 #include <unistd.h>
25 #include <cstring>
26 #include <sys/socket.h>
27 #include <sys/un.h>
28 #include <netinet/in.h>
29 #include <arpa/inet.h>
30 #include <net/route.h>
31 #include <netdb.h>
32 
33 #include "securec.h"
34 
35 #include "net_conn_constants.h"
36 #include "net_mgr_log_wrapper.h"
37 #include "netmanager_base_common_utils.h"
38 
39 using namespace OHOS::NetManagerStandard::CommonUtils;
40 namespace OHOS {
41 namespace NetManagerStandard {
42 namespace {
43 const std::string INTERFACE_LIST_DIR = "/sys/class/net/";
44 const std::string UID_LIST_DIR = "/data/data/uid/";
45 const std::string UID_TRAFFIC_BPF_PATH = "/dev/socket/traffic";
46 const std::string TEST_CELL_RX = "/data/cell_rx";
47 const std::string TEST_CELL_TX = "/data/cell_tx";
48 const std::string TEST_IFACE_RX = "/data/iface_rx";
49 const std::string TEST_IFACE_TX = "/data/iface_tx";
50 const std::string TEST_IFACE_RX_P = "/data/iface_rx_p";
51 const std::string TEST_IFACE_TX_P = "/data/iface_tx_p";
52 const std::string TEST_ALL_RX = "/data/all_tx";
53 const std::string TEST_ALL_TX = "/data/all_tx";
54 const std::string NET_STATS_FILE_RX_BYTES = "rx_bytes";
55 const std::string NET_STATS_FILE_TX_BYTES = "tx_bytes";
56 const std::string NET_STATS_FILE_RX_PACKETS = "rx_packets";
57 const std::string NET_STATS_FILE_TX_PACKETS = "tx_packets";
58 constexpr int32_t MOCK_MODULO_LAST_SIX_DIGITS = 100000;
59 
CheckFilePath(const std::string & fileName,std::string & realPath)60 bool CheckFilePath(const std::string &fileName, std::string &realPath)
61 {
62     char tmpPath[PATH_MAX] = {0};
63     if (!realpath(fileName.c_str(), tmpPath)) {
64         NETMGR_LOG_E("file name is illegal");
65         return false;
66     }
67     realPath = tmpPath;
68     return true;
69 }
70 } // namespace
71 
MockNetsysNativeClient()72 MockNetsysNativeClient::MockNetsysNativeClient()
73 {
74     Init();
75 }
76 
~MockNetsysNativeClient()77 MockNetsysNativeClient::~MockNetsysNativeClient() {}
78 
Init()79 void MockNetsysNativeClient::Init()
80 {
81     return;
82 }
83 
RegisterMockApi()84 void MockNetsysNativeClient::RegisterMockApi()
85 {
86     mockApi_.insert(MOCK_INTERFACECLEARADDRS_API);
87     mockApi_.insert(MOCK_GETCELLULARRXBYTES_API);
88     mockApi_.insert(MOCK_GETCELLULARTXBYTES_API);
89     mockApi_.insert(MOCK_GETALLRXBYTES_API);
90     mockApi_.insert(MOCK_GETALLTXBYTES_API);
91     mockApi_.insert(MOCK_GETUIDRXBYTES_API);
92     mockApi_.insert(MOCK_GETUIDTXBYTES_API);
93     mockApi_.insert(MOCK_GETUIDONIFACETXBYTES_API);
94     mockApi_.insert(MOCK_GETUIDONIFACETXBYTES_API);
95     mockApi_.insert(MOCK_GETIFACERXBYTES_API);
96     mockApi_.insert(MOCK_GETIFACETXBYTES_API);
97     mockApi_.insert(MOCK_INTERFACEGETLIST_API);
98     mockApi_.insert(MOCK_UIDGETLIST_API);
99     mockApi_.insert(MOCK_GETIFACERXPACKETS_API);
100     mockApi_.insert(MOCK_GETIFACETXPACKETS_API);
101     mockApi_.insert(MOCK_BINDSOCKET_API);
102     mockApi_.insert(MOCK_SHAREDNSSET_API);
103     mockApi_.insert(MOCK_REGISTERNETSYSNOTIFYCALLBACK_API);
104     mockApi_.insert(MOCK_BINDNETWORKSERVICEVPN_API);
105     mockApi_.insert(MOCK_ENABLEVIRTUALNETIFACECARD_API);
106     mockApi_.insert(MOCK_SETIPADDRESS_API);
107     mockApi_.insert(MOCK_SETBLOCKING_API);
108 }
109 
CheckMockApi(const std::string & api)110 bool MockNetsysNativeClient::CheckMockApi(const std::string &api)
111 {
112     return mockApi_.find(api) != mockApi_.end();
113 }
114 
NetworkCreatePhysical(int32_t netId,int32_t permission)115 int32_t MockNetsysNativeClient::NetworkCreatePhysical(int32_t netId, int32_t permission)
116 {
117     NETMGR_LOG_I("Create Physical network: netId[%{public}d], permission[%{public}d]", netId, permission);
118     return 0;
119 }
120 
NetworkDestroy(int32_t netId)121 int32_t MockNetsysNativeClient::NetworkDestroy(int32_t netId)
122 {
123     NETMGR_LOG_I("Destroy network: netId[%{public}d]", netId);
124     return 0;
125 }
126 
NetworkAddInterface(int32_t netId,const std::string & iface,NetBearType netBearerType)127 int32_t MockNetsysNativeClient::NetworkAddInterface(int32_t netId, const std::string &iface, NetBearType netBearerType)
128 {
129     NETMGR_LOG_I("Add network interface: netId[%{public}d], iface[%{public}s]", netId, iface.c_str());
130     return 0;
131 }
132 
NetworkRemoveInterface(int32_t netId,const std::string & iface)133 int32_t MockNetsysNativeClient::NetworkRemoveInterface(int32_t netId, const std::string &iface)
134 {
135     NETMGR_LOG_I("Remove network interface: netId[%{public}d], iface[%{public}s]", netId, iface.c_str());
136     return 0;
137 }
138 
NetworkAddRoute(int32_t netId,const std::string & ifName,const std::string & destination,const std::string & nextHop)139 int32_t MockNetsysNativeClient::NetworkAddRoute(int32_t netId, const std::string &ifName,
140     const std::string &destination, const std::string &nextHop)
141 {
142     NETMGR_LOG_I("Add Route: netId[%{public}d], ifName[%{public}s], destination[%{public}s], nextHop[%{public}s]",
143         netId, ifName.c_str(), ToAnonymousIp(destination).c_str(), ToAnonymousIp(nextHop).c_str());
144     std::string mask = "0.0.0.0";
145     return AddRoute(destination, mask, nextHop, ifName);
146 }
147 
NetworkRemoveRoute(int32_t netId,const std::string & ifName,const std::string & destination,const std::string & nextHop)148 int32_t MockNetsysNativeClient::NetworkRemoveRoute(int32_t netId, const std::string &ifName,
149     const std::string &destination, const std::string &nextHop)
150 {
151     NETMGR_LOG_I("Remove Route: netId[%{public}d], ifName[%{public}s], destination[%{public}s], nextHop[%{public}s]",
152         netId, ifName.c_str(), ToAnonymousIp(destination).c_str(), ToAnonymousIp(nextHop).c_str());
153     return 0;
154 }
155 
SetInterfaceDown(const std::string & iface)156 int32_t MockNetsysNativeClient::SetInterfaceDown(const std::string &iface)
157 {
158     NETMGR_LOG_I("Set interface down: iface[%{public}s]", iface.c_str());
159     return 0;
160 }
161 
SetInterfaceUp(const std::string & iface)162 int32_t MockNetsysNativeClient::SetInterfaceUp(const std::string &iface)
163 {
164     NETMGR_LOG_I("Set interface up: iface[%{public}s]", iface.c_str());
165     return 0;
166 }
167 
ClearInterfaceAddrs(const std::string & ifName)168 void MockNetsysNativeClient::ClearInterfaceAddrs(const std::string &ifName)
169 {
170     NETMGR_LOG_I("Clear addrs: ifName[%{public}s]", ifName.c_str());
171     return;
172 }
173 
GetInterfaceMtu(const std::string & ifName)174 int32_t MockNetsysNativeClient::GetInterfaceMtu(const std::string &ifName)
175 {
176     NETMGR_LOG_I("Get mtu: ifName[%{public}s]", ifName.c_str());
177     return 0;
178 }
179 
SetInterfaceMtu(const std::string & ifName,int32_t mtu)180 int32_t MockNetsysNativeClient::SetInterfaceMtu(const std::string &ifName, int32_t mtu)
181 {
182     NETMGR_LOG_I("Set mtu: ifName[%{public}s], mtu[%{public}d]", ifName.c_str(), mtu);
183     return 0;
184 }
185 
AddInterfaceAddress(const std::string & ifName,const std::string & ipAddr,int32_t prefixLength)186 int32_t MockNetsysNativeClient::AddInterfaceAddress(const std::string &ifName, const std::string &ipAddr,
187     int32_t prefixLength)
188 {
189     NETMGR_LOG_I("Add address: ifName[%{public}s], ipAddr[%{public}s], prefixLength[%{public}d]",
190         ifName.c_str(), ToAnonymousIp(ipAddr).c_str(), prefixLength);
191     return 0;
192 }
193 
DelInterfaceAddress(const std::string & ifName,const std::string & ipAddr,int32_t prefixLength)194 int32_t MockNetsysNativeClient::DelInterfaceAddress(const std::string &ifName, const std::string &ipAddr,
195     int32_t prefixLength)
196 {
197     NETMGR_LOG_I("Delete address: ifName[%{public}s], ipAddr[%{public}s], prefixLength[%{public}d]",
198         ifName.c_str(), ToAnonymousIp(ipAddr).c_str(), prefixLength);
199     return 0;
200 }
201 
SetResolverConfig(uint16_t netId,uint16_t baseTimeoutMsec,uint8_t retryCount,const std::vector<std::string> & servers,const std::vector<std::string> & domains)202 int32_t MockNetsysNativeClient::SetResolverConfig(uint16_t netId, uint16_t baseTimeoutMsec, uint8_t retryCount,
203     const std::vector<std::string> &servers, const std::vector<std::string> &domains)
204 {
205     NETMGR_LOG_I("Set resolver config: netId[%{public}d]", netId);
206     return 0;
207 }
208 
GetResolverConfig(uint16_t netId,std::vector<std::string> & servers,std::vector<std::string> & domains,uint16_t & baseTimeoutMsec,uint8_t & retryCount)209 int32_t MockNetsysNativeClient::GetResolverConfig(uint16_t netId, std::vector<std::string> &servers,
210     std::vector<std::string> &domains, uint16_t &baseTimeoutMsec, uint8_t &retryCount)
211 {
212     NETMGR_LOG_I("Get resolver config: netId[%{public}d]", netId);
213     return 0;
214 }
215 
CreateNetworkCache(uint16_t netId)216 int32_t MockNetsysNativeClient::CreateNetworkCache(uint16_t netId)
217 {
218     NETMGR_LOG_I("create dns cache: netId[%{public}d]", netId);
219     return 0;
220 }
221 
DestroyNetworkCache(uint16_t netId)222 int32_t MockNetsysNativeClient::DestroyNetworkCache(uint16_t netId)
223 {
224     NETMGR_LOG_I("Destroy dns cache: netId[%{public}d]", netId);
225     return 0;
226 }
227 
GetInterfaceTrafficByType(const std::string & path,const std::string & type)228 static long GetInterfaceTrafficByType(const std::string &path, const std::string &type)
229 {
230     if (path.empty()) {
231         return -1;
232     }
233     std::string trafficPath = path + type;
234     std::string realPath;
235     if (!CheckFilePath(trafficPath, realPath)) {
236         NETMGR_LOG_E("file does not exist! ");
237         return -1;
238     }
239     int fd = open(realPath.c_str(), 0, 0666);
240     if (fd == -1) {
241         return -1;
242     }
243     char buf[100] = {0};
244     if (read(fd, buf, sizeof(buf)) == -1) {
245         close(fd);
246         return -1;
247     }
248     close(fd);
249     long infBytes = atol(buf);
250     return infBytes;
251 }
252 
GetCellularRxBytes()253 int64_t MockNetsysNativeClient::GetCellularRxBytes()
254 {
255     NETMGR_LOG_I("GetCellularRxBytes");
256     if (access(TEST_CELL_RX.c_str(), F_OK) == 0) {
257         return 0;
258     }
259     return GetIfaceBytes("usb0", NET_STATS_FILE_RX_BYTES.c_str());
260 }
261 
GetCellularTxBytes()262 int64_t MockNetsysNativeClient::GetCellularTxBytes()
263 {
264     NETMGR_LOG_I("GetCellularTxBytes");
265     if (access(TEST_CELL_TX.c_str(), F_OK) == 0) {
266         return 0;
267     }
268     return GetIfaceBytes("usb0", NET_STATS_FILE_TX_BYTES.c_str());
269 }
270 
GetAllBytes(const std::string & filename)271 int64_t MockNetsysNativeClient::GetAllBytes(const std::string &filename)
272 {
273     NETMGR_LOG_I("GetAllBytes");
274     long allBytes = 0;
275     std::vector<std::string> ifNameList = InterfaceGetList();
276     if (ifNameList.empty()) {
277         return allBytes;
278     }
279     for (auto iter = ifNameList.begin(); iter != ifNameList.end(); iter++) {
280         if (*iter != "lo") {
281             std::string base_traffic_path = INTERFACE_LIST_DIR + (*iter) + "/" + "statistics" + "/";
282             long bytes = GetInterfaceTrafficByType(base_traffic_path, filename.c_str());
283             allBytes = allBytes + bytes;
284         }
285     }
286     return allBytes;
287 }
288 
GetAllRxBytes()289 int64_t MockNetsysNativeClient::GetAllRxBytes()
290 {
291     NETMGR_LOG_I("GetAllRxBytes");
292     if (access(TEST_ALL_RX.c_str(), F_OK) == 0) {
293         return 0;
294     }
295     return GetAllBytes(NET_STATS_FILE_RX_BYTES.c_str());
296 }
297 
GetAllTxBytes()298 int64_t MockNetsysNativeClient::GetAllTxBytes()
299 {
300     NETMGR_LOG_I("GetAllTxBytes");
301     if (access(TEST_ALL_TX.c_str(), F_OK) == 0) {
302         return 0;
303     }
304     return GetAllBytes(NET_STATS_FILE_TX_BYTES.c_str());
305 }
306 
GetUidTrafficFromBpf(int uid,int cgroupType)307 static long GetUidTrafficFromBpf(int uid, int cgroupType)
308 {
309     int sock = socket(AF_UNIX, SOCK_STREAM, 0);
310     if (sock < 0) {
311         close(sock);
312         return -1;
313     }
314     sockaddr_un sockAddrInfo;
315     sockAddrInfo.sun_family = AF_UNIX;
316     if (strcpy_s(sockAddrInfo.sun_path, sizeof(sockAddrInfo.sun_path), UID_TRAFFIC_BPF_PATH.c_str()) != 0) {
317         close(sock);
318         return -1;
319     }
320     if (connect(sock, reinterpret_cast<sockaddr *>(&sockAddrInfo), sizeof(sockAddrInfo)) != 0) {
321         close(sock);
322         return -1;
323     }
324     char buf[128];
325     bzero(buf, sizeof(buf));
326     std::string query = std::to_string(uid) + "," + std::to_string(cgroupType);
327     if (strcpy_s(buf, sizeof(buf), query.c_str()) != 0) {
328         close(sock);
329         return -1;
330     }
331     ssize_t writeRet = write(sock, buf, strlen(buf));
332     if (writeRet < 0) {
333         close(sock);
334         return -1;
335     }
336     bzero(buf, sizeof(buf));
337     ssize_t readRet = read(sock, buf, sizeof(buf));
338     if (readRet < 0) {
339         close(sock);
340         return -1;
341     }
342     close(sock);
343     return atol(buf);
344 }
345 
GetUidRxBytes(uint32_t uid)346 int64_t MockNetsysNativeClient::GetUidRxBytes(uint32_t uid)
347 {
348     NETMGR_LOG_D("GetUidRxBytes uid is [%{public}u]", uid);
349     long result = GetUidTrafficFromBpf(uid, 0);
350     return static_cast<int64_t>(result);
351 }
352 
GetUidTxBytes(uint32_t uid)353 int64_t MockNetsysNativeClient::GetUidTxBytes(uint32_t uid)
354 {
355     NETMGR_LOG_D("GetUidTxBytes uid is [%{public}u]", uid);
356     long result = GetUidTrafficFromBpf(uid, 1);
357     return static_cast<int64_t>(result);
358 }
359 
GetUidOnIfaceBytes(uint32_t uid,const std::string & interfaceName)360 static int64_t GetUidOnIfaceBytes(uint32_t uid, const std::string &interfaceName)
361 {
362     time_t now = time(nullptr);
363     now %= MOCK_MODULO_LAST_SIX_DIGITS;
364     return static_cast<int64_t>(now);
365 }
366 
GetUidOnIfaceRxBytes(uint32_t uid,const std::string & interfaceName)367 int64_t MockNetsysNativeClient::GetUidOnIfaceRxBytes(uint32_t uid, const std::string &interfaceName)
368 {
369     NETMGR_LOG_D("GetUidOnIfaceRxBytes uid is [%{public}u] "
370         "iface name is [%{public}s]", uid, interfaceName.c_str());
371     return GetUidOnIfaceBytes(uid, interfaceName);
372 }
373 
GetUidOnIfaceTxBytes(uint32_t uid,const std::string & interfaceName)374 int64_t MockNetsysNativeClient::GetUidOnIfaceTxBytes(uint32_t uid, const std::string &interfaceName)
375 {
376     NETMGR_LOG_D("GetUidOnIfaceRxBytes uid is [%{public}u] "
377         "iface name is [%{public}s]", uid, interfaceName.c_str());
378     return GetUidOnIfaceBytes(uid, interfaceName);
379 }
380 
GetIfaceBytes(const std::string & interfaceName,const std::string & filename)381 int64_t MockNetsysNativeClient::GetIfaceBytes(const std::string &interfaceName, const std::string &filename)
382 {
383     int64_t bytes = 0;
384     std::vector<std::string> ifNameList = InterfaceGetList();
385     if (ifNameList.empty()) {
386         return bytes;
387     }
388     for (auto iter = ifNameList.begin(); iter != ifNameList.end(); iter++) {
389         if (interfaceName == *iter) {
390             std::string baseTrafficPath = INTERFACE_LIST_DIR + (*iter) + "/" + "statistics" + "/";
391             long infRxBytes = GetInterfaceTrafficByType(baseTrafficPath, filename.c_str());
392             bytes = infRxBytes == -1 ? 0 : infRxBytes;
393         }
394     }
395     return bytes;
396 }
397 
GetIfaceRxBytes(const std::string & interfaceName)398 int64_t MockNetsysNativeClient::GetIfaceRxBytes(const std::string &interfaceName)
399 {
400     NETMGR_LOG_D("GetIfaceRxBytes iface name is [%{public}s]", interfaceName.c_str());
401     if (access(TEST_IFACE_RX.c_str(), F_OK) == 0) {
402         return 0;
403     }
404     return GetIfaceBytes(interfaceName, NET_STATS_FILE_RX_BYTES.c_str());
405 }
406 
GetIfaceTxBytes(const std::string & interfaceName)407 int64_t MockNetsysNativeClient::GetIfaceTxBytes(const std::string &interfaceName)
408 {
409     NETMGR_LOG_D("GetIfaceTxBytes iface name is [%{public}s]", interfaceName.c_str());
410     if (access(TEST_IFACE_TX.c_str(), F_OK) == 0) {
411         return 0;
412     }
413     return GetIfaceBytes(interfaceName, NET_STATS_FILE_TX_BYTES.c_str());
414 }
415 
GetIfaceRxPackets(const std::string & interfaceName)416 int64_t MockNetsysNativeClient::GetIfaceRxPackets(const std::string &interfaceName)
417 {
418     NETMGR_LOG_D("GetIfaceRxPackets iface name is [%{public}s]", interfaceName.c_str());
419     if (access(TEST_IFACE_RX_P.c_str(), F_OK) == 0) {
420         return 0;
421     }
422     return GetIfaceBytes(interfaceName, NET_STATS_FILE_RX_PACKETS.c_str());
423 }
424 
GetIfaceTxPackets(const std::string & interfaceName)425 int64_t MockNetsysNativeClient::GetIfaceTxPackets(const std::string &interfaceName)
426 {
427     NETMGR_LOG_D("GetIfaceTxPackets iface name is [%{public}s]", interfaceName.c_str());
428     if (access(TEST_IFACE_TX_P.c_str(), F_OK) == 0) {
429         return 0;
430     }
431     return GetIfaceBytes(interfaceName, NET_STATS_FILE_TX_PACKETS.c_str());
432 }
433 
InterfaceGetList()434 std::vector<std::string> MockNetsysNativeClient::InterfaceGetList()
435 {
436     NETMGR_LOG_D("InterfaceGetList");
437     DIR *dir(nullptr);
438     std::vector<std::string> ifList;
439     if ((dir = opendir(INTERFACE_LIST_DIR.c_str())) == nullptr) {
440         return ifList;
441     }
442     struct dirent *ptr(nullptr);
443     while ((ptr = readdir(dir)) != nullptr) {
444         if (strcmp(ptr->d_name, ".") == 0 || strcmp(ptr->d_name, "..") == 0) {
445             continue;
446         }
447         ifList.push_back(ptr->d_name);
448     }
449     closedir(dir);
450     return ifList;
451 }
452 
UidGetList()453 std::vector<std::string> MockNetsysNativeClient::UidGetList()
454 {
455     NETMGR_LOG_I("UidGetList");
456     DIR *dir(nullptr);
457     std::vector<std::string> uidList;
458     if ((dir = opendir(UID_LIST_DIR.c_str())) == nullptr) {
459         return uidList;
460     }
461     struct dirent *ptr(nullptr);
462     while ((ptr = readdir(dir)) != nullptr) {
463         if (strcmp(ptr->d_name, ".") == 0 || strcmp(ptr->d_name, "..") == 0) {
464             continue;
465         }
466         uidList.push_back(ptr->d_name);
467     }
468     closedir(dir);
469     return uidList;
470 }
471 
AddRoute(const std::string & ip,const std::string & mask,const std::string & gateWay,const std::string & devName)472 int32_t MockNetsysNativeClient::AddRoute(const std::string &ip, const std::string &mask,
473     const std::string &gateWay, const std::string &devName)
474 {
475     struct sockaddr_in _sin;
476     struct rtentry  rt;
477     bzero(&rt, sizeof(struct rtentry));
478     bzero(&_sin, sizeof(struct sockaddr_in));
479     _sin.sin_family = AF_INET;
480     _sin.sin_port = 0;
481     if (inet_aton(gateWay.c_str(), &(_sin.sin_addr)) < 0) {
482         NETMGR_LOG_E("inet_aton gateWay[%{private}s]", gateWay.c_str());
483         return -1;
484     }
485     int copyRet = memcpy_s(&rt.rt_gateway, sizeof(rt.rt_gateway), &_sin, sizeof(struct sockaddr_in));
486     NETMGR_LOG_I("copyRet = %{public}d", copyRet);
487     (reinterpret_cast<struct sockaddr_in *>(&rt.rt_dst))->sin_family = AF_INET;
488     if (inet_aton(ip.c_str(), &((struct sockaddr_in *)&rt.rt_dst)->sin_addr) < 0) {
489         NETMGR_LOG_E("inet_aton ip[%{public}s]", ToAnonymousIp(ip).c_str());
490         return -1;
491     }
492     (reinterpret_cast<struct sockaddr_in *>(&rt.rt_genmask))->sin_family = AF_INET;
493     if (inet_aton(mask.c_str(), &(reinterpret_cast<struct sockaddr_in *>(&rt.rt_genmask))->sin_addr) < 0) {
494         NETMGR_LOG_E("inet_aton mask[%{public}s]", mask.c_str());
495         return -1;
496     }
497     auto name = std::make_unique<char[]>(devName.size());
498     if (!devName.empty()) {
499         if (strcpy_s(name.get(), devName.size(), devName.c_str()) != 0) {
500             return -1;
501         }
502         rt.rt_dev = name.get();
503     }
504     rt.rt_flags = RTF_GATEWAY;
505     int fd = socket(AF_INET, SOCK_DGRAM, 0);
506     if (fd < 0) {
507         NETMGR_LOG_E("create socket fd[%{public}d]", fd);
508         return -1;
509     }
510     if (ioctl(fd, SIOCADDRT, &rt) < 0) {
511         NETMGR_LOG_E("ioctl error");
512         close(fd);
513         return -1;
514     }
515     close(fd);
516     return 0;
517 }
518 
SetDefaultNetWork(int32_t netId)519 int32_t MockNetsysNativeClient::SetDefaultNetWork(int32_t netId)
520 {
521     NETMGR_LOG_D("SetDefaultNetWork netId is [%{public}d]", netId);
522     return 0;
523 }
524 
ClearDefaultNetWorkNetId()525 int32_t MockNetsysNativeClient::ClearDefaultNetWorkNetId()
526 {
527     NETMGR_LOG_D("ClearDefaultNetWorkNetId");
528     return 0;
529 }
530 
BindSocket(int32_t socketFd,uint32_t netId)531 int32_t MockNetsysNativeClient::BindSocket(int32_t socketFd, uint32_t netId)
532 {
533     NETMGR_LOG_D("BindSocket: netId = [%{public}u]", netId);
534     return NETMANAGER_SUCCESS;
535 }
536 
ShareDnsSet(uint16_t netId)537 int32_t MockNetsysNativeClient::ShareDnsSet(uint16_t netId)
538 {
539     NETMGR_LOG_D("ShareDnsSet: netId[%{public}d]", netId);
540     return 0;
541 }
542 
RegisterNetsysNotifyCallback(const NetsysNotifyCallback & callback)543 int32_t MockNetsysNativeClient::RegisterNetsysNotifyCallback(const NetsysNotifyCallback &callback)
544 {
545     NETMGR_LOG_D("RegisterNetsysNotifyCallback");
546     return 0;
547 }
548 
BindNetworkServiceVpn(int32_t socketFd)549 int32_t MockNetsysNativeClient::BindNetworkServiceVpn(int32_t socketFd)
550 {
551     NETMGR_LOG_D("BindNetworkServiceVpn: socketFd[%{public}d]", socketFd);
552     return 0;
553 }
554 
EnableVirtualNetIfaceCard(int32_t socketFd,struct ifreq & ifRequest,int32_t & ifaceFd)555 int32_t MockNetsysNativeClient::EnableVirtualNetIfaceCard(int32_t socketFd, struct ifreq &ifRequest, int32_t &ifaceFd)
556 {
557     NETMGR_LOG_D("EnableVirtualNetIfaceCard: socketFd[%{public}d]", socketFd);
558     const char *ifaceName = "wlan0";
559     strncpy_s(ifRequest.ifr_name, sizeof(ifRequest.ifr_name), ifaceName, strlen(ifaceName));
560     NETMGR_LOG_D("ifRequest.ifr_name[%{public}s]", ifRequest.ifr_name);
561     ifaceFd = 1;
562     return 0;
563 }
564 
SetIpAddress(int32_t socketFd,const std::string & ipAddress,int32_t prefixLen,struct ifreq & ifRequest)565 int32_t MockNetsysNativeClient::SetIpAddress(int32_t socketFd, const std::string &ipAddress, int32_t prefixLen,
566     struct ifreq &ifRequest)
567 {
568     return 0;
569 }
570 
SetBlocking(int32_t ifaceFd,bool isBlock)571 int32_t MockNetsysNativeClient::SetBlocking(int32_t ifaceFd, bool isBlock)
572 {
573     NETMGR_LOG_D("SetBlocking: ifaceFd[%{public}d], isBlock[%{public}d]", ifaceFd, isBlock);
574     return 0;
575 }
576 
StartDhcpClient(const std::string & iface,bool bIpv6)577 int32_t MockNetsysNativeClient::StartDhcpClient(const std::string &iface, bool bIpv6)
578 {
579     NETMGR_LOG_D("StartDhcpClient: iface[%{public}s], bIpv6[%{public}d]", iface.c_str(),
580         bIpv6);
581     return 0;
582 }
583 
StopDhcpClient(const std::string & iface,bool bIpv6)584 int32_t MockNetsysNativeClient::StopDhcpClient(const std::string &iface, bool bIpv6)
585 {
586     NETMGR_LOG_D("StopDhcpClient: iface[%{public}s], bIpv6[%{public}d]", iface.c_str(),
587         bIpv6);
588     return 0;
589 }
590 
RegisterCallback(sptr<NetsysControllerCallback> callback)591 int32_t MockNetsysNativeClient::RegisterCallback(sptr<NetsysControllerCallback> callback)
592 {
593     NETMGR_LOG_D("RegisterCallback");
594     return 0;
595 }
596 
StartDhcpService(const std::string & iface,const std::string & ipv4addr)597 int32_t MockNetsysNativeClient::StartDhcpService(const std::string &iface, const std::string &ipv4addr)
598 {
599     return 0;
600 }
601 
StopDhcpService(const std::string & iface)602 int32_t MockNetsysNativeClient::StopDhcpService(const std::string &iface)
603 {
604     return 0;
605 }
606 
SetIpv6PrivacyExtensions(const std::string & interfaceName,const uint32_t on)607 int32_t MockNetsysNativeClient::SetIpv6PrivacyExtensions(const std::string &interfaceName, const uint32_t on)
608 {
609     return 0;
610 }
611 
SetEnableIpv6(const std::string & interfaceName,const uint32_t on)612 int32_t MockNetsysNativeClient::SetEnableIpv6(const std::string &interfaceName, const uint32_t on)
613 {
614     return 0;
615 }
616 } // namespace NetManagerStandard
617 } // namespace OHOS
618