• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2025-2026 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 #include <arpa/inet.h>
16 #include <mutex>
17 #include <condition_variable>
18 #include "networkslice_kernel_proxy.h"
19 #include "networksliceutil.h"
20 #include "state_utils.h"
21 #include "net_conn_client.h"
22 #include "hwnetworkslicemanager.h"
23 #include "broadcast_proxy.h"
24 #include "core_service_client.h"
25 #include "networkslicemanager.h"
26 
27 namespace OHOS {
28 namespace NetManagerStandard {
29 const std::string NETMANAGER_EXT_NETWORKSLICE_ABILITY = "persist.netmgr_ext.networkslice";
30 const std::string COMMA_SEPARATOR = ",";
31 constexpr uint8_t COLLECT_MODEM_DATA = 0x00;
32 constexpr int BASE_16 = 16;
33 constexpr int APPID_OSID_SIZE = 2;
34 constexpr int IPV4ADDRTOTALLEN = 15;
35 constexpr int IPV6ADDRTOTALLEN = 27;
36 constexpr short IP_PARA_REPORT_CONTROL_MSG = 9;
37 constexpr short KERNEL_BIND_UID_MSG = 15;
38 constexpr short KERNEL_DEL_UID_BIND_MSG = 16;
39 constexpr int DEL_BIND_ALL = 0;
40 constexpr int DEL_BIND_NETID = 1;
41 constexpr int DEL_BIND_PRECEDENCE = 2;
42 constexpr int64_t NETWORK_SLICE_PARA_FORBIDDEN_MS = 12 * 60 * 1000L;
43 constexpr int NETWORK_ACTIVATE_RESULT_SUCCESS = 0;
44 constexpr int NETWORK_ACTIVATE_RESULT_NORMAL_FAIL = 1;
45 constexpr int32_t WIFICONNECTED = 4;
46 constexpr int32_t WIFIDISCONNECTED = 6;
47 constexpr int SIZE_TWO = 2;
48 std::shared_ptr<broadcast_proxy> g_broadcastProxy = nullptr;
49 std::shared_ptr<NrUnsolicitedMsgParser> sNrUnsolicitedMsgParser_ = nullptr;
50 std::shared_ptr<UrspConfig> sUrspConfig_ = nullptr;
51 
NetworkSliceManager()52 NetworkSliceManager::NetworkSliceManager() : NetworkSliceServiceBase(MODULE_NETWORKSLICE)
53 {}
54 
~NetworkSliceManager()55 NetworkSliceManager::~NetworkSliceManager()
56 {}
57 
OnInit()58 void NetworkSliceManager::OnInit()
59 {
60     NETMGR_EXT_LOG_I("NetworkSliceManager::OnInit.");
61     if (!isNrSlicesSupported()) {
62         NETMGR_EXT_LOG_I("NetworkSliceManager Not support Nrslice.");
63         return;
64     }
65     InitUePolicy();
66     DelayedSingleton<NetworkSliceKernelProxy>::GetInstance()->StartNetlink();
67     DelayedSingleton<NetworkSliceKernelProxy>::GetInstance()->StartRecvThread();
68     Subscribe(EVENT_HANDLE_ALLOWED_NSSAI);
69     Subscribe(EVENT_HANDLE_UE_POLICY);
70     Subscribe(EVENT_INIT_UE_POLICY);
71     Subscribe(EVENT_HANDLE_SIM_STATE_CHANGED);
72     Subscribe(EVENT_HANDLE_EHPLMN);
73     Subscribe(EVENT_BIND_TO_NETWORK);
74     Subscribe(EVENT_DEL_BIND_TO_NETWORK);
75     Subscribe(EVENT_FOREGROUND_APP_CHANGED);
76     Subscribe(EVENT_AIR_MODE_CHANGED);
77     Subscribe(EVENT_NETWORK_STATE_CHANGED);
78     Subscribe(EVENT_WIFI_CONN_CHANGED);
79     Subscribe(EVENT_VPN_MODE_CHANGED);
80     Subscribe(EVENT_CONNECTIVITY_CHANGE);
81     Subscribe(EVENT_SCREEN_ON);
82     Subscribe(EVENT_SCREEN_OFF);
83     Subscribe(EVENT_URSP_CHANGED);
84     g_broadcastProxy = std::make_shared<broadcast_proxy>();
85     DelayedSingleton<HwNetworkSliceManager>::GetInstance()->Init();
86 }
87 
ProcessEvent(const AppExecFwk::InnerEvent::Pointer & event)88 void NetworkSliceManager::ProcessEvent(const AppExecFwk::InnerEvent::Pointer& event)
89 {
90     if (event == nullptr) {
91         return;
92     }
93     NETMGR_EXT_LOG_I("event id:%{public}d", event->GetInnerEventId());
94     switch (event->GetInnerEventId()) {
95         case EVENT_GET_SLICE_PARA:
96             GetRouteSelectionDescriptorByAppDescriptor(event->GetSharedObject<GetSlicePara>());
97             break;
98         case EVENT_HANDLE_ALLOWED_NSSAI:
99             HandleAllowedNssaiFromUnsolData(event->GetSharedObject<std::vector<uint8_t>>());
100             break;
101         case EVENT_HANDLE_UE_POLICY:
102             HandleUrspFromUnsolData(event->GetSharedObject<std::vector<uint8_t>>());
103             break;
104         case EVENT_KERNEL_IP_ADDR_REPORT:
105             HandleIpRpt(event->GetSharedObject<std::vector<uint8_t>>());
106             break;
107         case EVENT_BIND_TO_NETWORK:
108             BindProcessToNetworkByFullPara(event->GetSharedObject<std::map<std::string, std::string>>());
109             break;
110         case EVENT_DEL_BIND_TO_NETWORK:
111             DeleteNetworkBindByFullPara(event->GetSharedObject<std::map<std::string, std::string>>());
112             break;
113         case EVENT_HANDLE_EHPLMN:
114             HandleEhplmnFromUnsolData(event->GetSharedObject<std::vector<uint8_t>>());
115             break;
116         case EVENT_URSP_CHANGED:
117         case EVENT_NETWORK_STATE_CHANGED:
118         case EVENT_CONNECTIVITY_CHANGE:
119         case EVENT_SYSTEM_WIFI_NETWORK_STATE_CHANGED:
120         case EVENT_FOREGROUND_APP_CHANGED:
121         case EVENT_AIR_MODE_CHANGED:
122         case EVENT_WIFI_CONN_CHANGED:
123         case EVENT_VPN_MODE_CHANGED:
124         case EVENT_SCREEN_ON:
125         case EVENT_SCREEN_OFF:
126         case EVENT_NETWORK_PARA_FORBIDDEN_TIMEOUT:
127         case EVENT_HANDLE_SIM_STATE_CHANGED:
128             ProcessEventEx(event);
129             break;
130         default:
131             NETMGR_EXT_LOG_I("unknow msg");
132             break;
133     }
134 }
135 
ProcessEventEx(const AppExecFwk::InnerEvent::Pointer & event)136 void NetworkSliceManager::ProcessEventEx(const AppExecFwk::InnerEvent::Pointer& event)
137 {
138     switch (event->GetInnerEventId()) {
139         case EVENT_NETWORK_STATE_CHANGED:
140             IpParaReportControl();
141             SendUrspUpdateMsg();
142             break;
143         case EVENT_CONNECTIVITY_CHANGE:
144         case EVENT_SYSTEM_WIFI_NETWORK_STATE_CHANGED:
145             IpParaReportControl();
146             break;
147         case EVENT_FOREGROUND_APP_CHANGED:
148             HandleForegroundAppChanged(event->GetSharedObject<AppExecFwk::AppStateData>());
149             break;
150         case EVENT_AIR_MODE_CHANGED:
151             HandleAirModeChanged(event->GetParam());
152             break;
153         case EVENT_WIFI_CONN_CHANGED:
154             HandleWifiConnChanged(event->GetParam());
155             break;
156         case EVENT_VPN_MODE_CHANGED:
157             HandleVpnModeChanged(event->GetParam());
158             break;
159         case EVENT_SCREEN_ON:
160             HandleScreenOn();
161             break;
162         case EVENT_SCREEN_OFF:
163             HandleScreenOff();
164             break;
165         case EVENT_HANDLE_SIM_STATE_CHANGED:
166             HandleSimStateChanged();
167             break;
168         case EVENT_URSP_CHANGED:
169             HandleUrspChanged(event->GetSharedObject<std::map<std::string, std::string>>());
170             break;
171     }
172 }
173 
HandleForegroundAppChanged(const std::shared_ptr<AppExecFwk::AppStateData> & msg)174 void NetworkSliceManager::HandleForegroundAppChanged(const std::shared_ptr<AppExecFwk::AppStateData>& msg)
175 {
176     if (msg == nullptr) {
177         NETMGR_EXT_LOG_E("HandleForegroundAppChanged appStateData is null");
178         return;
179     }
180     int32_t uid = msg->uid;
181     foregroundApp_uid = uid;
182     std::string bundleName = msg->bundleName;
183     NETMGR_EXT_LOG_E("HandleForegroundAppChanged uid = %{public}d, bundleName = %{public}s", uid, bundleName.c_str());
184     if (msg->bundleName == "com.ohos.sceneboard") {
185         return;
186     }
187     if (msg->state == static_cast<int32_t>(AppExecFwk::ApplicationState::APP_STATE_FOREGROUND) && msg->isFocused == 1) {
188         NETMGR_EXT_LOG_E("HandleForegroundAppChanged RequestNetworkSliceForPackageName");
189         DelayedSingleton<HwNetworkSliceManager>::GetInstance()->RequestNetworkSliceForPackageName(uid, bundleName);
190         return;
191     } else if (msg->state == static_cast<int32_t>(AppExecFwk::ApplicationState::APP_STATE_BACKGROUND)) {
192         DelayedSingleton<HwNetworkSliceManager>::GetInstance()->ReleaseNetworkSliceByApp(uid);
193     } else if (msg->state == static_cast<int32_t>(AppExecFwk::ApplicationState::APP_STATE_TERMINATED)) {
194         DelayedSingleton<HwNetworkSliceManager>::GetInstance()->HandleUidGone(uid);
195     }
196 }
197 
HandleUrspChanged(const std::shared_ptr<std::map<std::string,std::string>> & msg)198 void NetworkSliceManager::HandleUrspChanged(const std::shared_ptr<std::map<std::string, std::string>>& msg)
199 {
200     NETMGR_EXT_LOG_I("NetworkSliceManager::HandleUrspChanged");
201     if (!msg) {
202         NETMGR_EXT_LOG_E("nullptr");
203         return;
204     }
205     std::map<std::string, std::string> data = *msg;
206     DelayedSingleton<HwNetworkSliceManager>::GetInstance()->HandleUrspChanged(data);
207 }
208 
HandleAirModeChanged(int32_t mode)209 void NetworkSliceManager::HandleAirModeChanged(int32_t mode)
210 {
211     if (mode == 0) {
212         airModeOn_ = false;
213     } else {
214         airModeOn_ = true;
215     }
216 }
217 
HandleWifiConnChanged(int32_t state)218 void NetworkSliceManager::HandleWifiConnChanged(int32_t state)
219 {
220     bool wifiConnLastStatus = wifiConn_;
221     if (state == WIFICONNECTED) {
222         wifiConn_ = true;
223     } else if (state == WIFIDISCONNECTED) {
224         wifiConn_ = false;
225     }
226     if (wifiConnLastStatus != wifiConn_) {
227         DelayedSingleton<HwNetworkSliceManager>::GetInstance()->onWifiNetworkStateChanged(wifiConn_);
228     }
229 }
230 
HandleVpnModeChanged(bool mode)231 void NetworkSliceManager::HandleVpnModeChanged(bool mode)
232 {
233     vpnMode_ = mode;
234 }
235 
HandleScreenOn()236 void NetworkSliceManager::HandleScreenOn()
237 {
238     screenOn_ = true;
239 }
240 
HandleScreenOff()241 void NetworkSliceManager::HandleScreenOff()
242 {
243     screenOn_ = false;
244 }
245 
SendUrspUpdateMsg()246 void NetworkSliceManager::SendUrspUpdateMsg()
247 {
248     if ((!mIsUrspFirstReported) && isSaState()) {
249         if (sNrUnsolicitedMsgParser_ != nullptr) {
250             sNrUnsolicitedMsgParser_->SendUrspUpdate();
251         }
252         mIsUrspFirstReported = true;
253     }
254 }
255 
HandleSimStateChanged()256 void NetworkSliceManager::HandleSimStateChanged()
257 {
258     NETMGR_EXT_LOG_I("NetworkSliceManager::HandleSimStateChanged");
259     if (sNrUnsolicitedMsgParser_ != nullptr) {
260         sNrUnsolicitedMsgParser_->HandleSimStateChanged();
261     }
262     if (mApnStartflag == false) {
263         DelayedSingleton<NetworkSliceService>::GetInstance()->UpdateNetworkSliceApn();
264         mApnStartflag = true;
265     }
266     return;
267 }
268 
HandleAllowedNssaiFromUnsolData(const std::shared_ptr<std::vector<uint8_t>> & msg)269 void NetworkSliceManager::HandleAllowedNssaiFromUnsolData(const std::shared_ptr<std::vector<uint8_t>>& msg)
270 {
271     NETMGR_EXT_LOG_I("NetworkSliceManager::HandleAllowedNssaiFromUnsolData");
272     if (!msg) {
273         NETMGR_EXT_LOG_E("nullptr");
274         return;
275     }
276     std::vector<uint8_t> buffer = *msg;
277     NETMGR_EXT_LOG_I("buffer size:%{public}d", (int)buffer.size());
278     if (buffer.empty()) {
279         NETMGR_EXT_LOG_E("NetworkSliceManager::HandleAllowedNssaiFromUnsolData: buffer is invalid");
280         return;
281     }
282     if (sNrUnsolicitedMsgParser_ != nullptr) {
283         sNrUnsolicitedMsgParser_->GetAllowedNssaiFromUnsolData(buffer);
284     }
285     return;
286 }
287 
HandleUrspFromUnsolData(const std::shared_ptr<std::vector<uint8_t>> & msg)288 void NetworkSliceManager::HandleUrspFromUnsolData(const std::shared_ptr<std::vector<uint8_t>>& msg)
289 {
290     NETMGR_EXT_LOG_I("NetworkSliceManager::HandleUrspFromUnsolData");
291     if (!msg) {
292         NETMGR_EXT_LOG_E("nullptr");
293         return;
294     }
295 
296     std::vector<uint8_t> buffer = *msg;
297     NETMGR_EXT_LOG_I("buffer size:%{public}d", (int)buffer.size());
298     if (buffer.empty()) {
299         NETMGR_EXT_LOG_E("NetworkSliceManager::HandleUrspFromUnsolData: buffer is invalid");
300         return;
301     }
302     if (sNrUnsolicitedMsgParser_ == nullptr) {
303         NETMGR_EXT_LOG_E("sNrUnsolicitedMsgParser_ == nullptr");
304         return;
305     }
306     if (sNrUnsolicitedMsgParser_ != nullptr) {
307         sNrUnsolicitedMsgParser_->GetUrspFromUnsolData(buffer);
308     }
309     return;
310 }
311 
HandleEhplmnFromUnsolData(const std::shared_ptr<std::vector<uint8_t>> & msg)312 void NetworkSliceManager::HandleEhplmnFromUnsolData(const std::shared_ptr<std::vector<uint8_t>>& msg)
313 {
314     NETMGR_EXT_LOG_I("NetworkSliceManager::HandleEhplmnFromUnsolData");
315     if (!msg) {
316         NETMGR_EXT_LOG_E("nullptr");
317         return;
318     }
319     std::vector<uint8_t> buffer = *msg;
320     NETMGR_EXT_LOG_I("buffer size:%{public}d", (int)buffer.size());
321     if (buffer.empty()) {
322         NETMGR_EXT_LOG_E("NetworkSliceManager::HandleEhplmnFromUnsolData: buffer is invalid");
323         return;
324     }
325     if (sNrUnsolicitedMsgParser_ != nullptr) {
326         sNrUnsolicitedMsgParser_->GetEhplmnFromUnsolData(buffer);
327     }
328     return;
329 }
330 
InitUePolicy()331 void NetworkSliceManager::InitUePolicy()
332 {
333     NETMGR_EXT_LOG_I("NetworkSliceManager:InitUePolicy");
334     sUrspConfig_ = std::make_shared<UrspConfig>(UrspConfig::GetInstance());
335     sNrUnsolicitedMsgParser_ = std::make_shared<NrUnsolicitedMsgParser>(NrUnsolicitedMsgParser::GetInstance());
336     IpParaReportControl();
337     return;
338 }
339 
HandleIpRpt(const std::shared_ptr<std::vector<uint8_t>> & msg)340 void NetworkSliceManager::HandleIpRpt(const std::shared_ptr<std::vector<uint8_t>>& msg)
341 {
342     NETMGR_EXT_LOG_I("NetworkSliceManager::HandleIpRpt");
343     if (!msg) {
344         NETMGR_EXT_LOG_E("nullptr");
345         return;
346     }
347     std::vector<uint8_t> buffer = *msg;
348     NETMGR_EXT_LOG_I("buffer size:%{public}d", (int)buffer.size());
349     if (buffer.size() < NetworkSliceCommConfig::LEN_SHORT) {
350         NETMGR_EXT_LOG_E("get type, buffer.size() < NetworkSliceCommConfig::LEN_SHORT");
351         return;
352     }
353     int startIndex = 0;
354     short type = GetShort(startIndex, buffer, true);
355     if (((int)buffer.size() - startIndex) < NetworkSliceCommConfig::LEN_SHORT) {
356         NETMGR_EXT_LOG_E("get len, buffer.size() < NetworkSliceCommConfig::LEN_SHORT");
357         return;
358     }
359     short len = GetShort(startIndex, buffer, true);
360     AppDescriptor appDescriptor;
361     if (((int)buffer.size() - startIndex) < NetworkSliceCommConfig::LEN_INT) {
362         NETMGR_EXT_LOG_E("get uid for Ipv4Addr, buffer.size() < NetworkSliceCommConfig::LEN_INT");
363         return;
364     }
365     appDescriptor.setUid(GetInt(startIndex, buffer, true));
366     std::map<std::string, std::string> bundle;
367     bundle["uid"] = appDescriptor.getUid();
368     if (len == IPV4ADDRTOTALLEN) {
369     } else if (len == IPV6ADDRTOTALLEN) {
370         HandleIpv6Rpt(startIndex, buffer, bundle, appDescriptor);
371     } else {
372         NETMGR_EXT_LOG_E("ip report len is invalid ");
373     }
374 }
375 
onUrspAvailableStateChanged()376 void NetworkSliceManager::onUrspAvailableStateChanged()
377 {
378     IpParaReportControl();
379 }
380 
BindProcessToNetworkByFullPara(std::shared_ptr<std::map<std::string,std::string>> msg)381 void NetworkSliceManager::BindProcessToNetworkByFullPara(std::shared_ptr<std::map<std::string, std::string>> msg)
382 {
383     if (!msg) {
384         NETMGR_EXT_LOG_E("nullptr");
385         return;
386     }
387     NETMGR_EXT_LOG_E("NetworkSliceManager::BindProcessToNetworkByFullPara");
388     std::map<std::string, std::string> data = *(msg.get());
389     AddRoutePara addRoutePara;
390     if (!GetRoutePara(addRoutePara, data)) {
391         return;
392     }
393     NETMGR_EXT_LOG_E("bindProcessToNetworkByFullPara, netId = %{public}d, urspPrecedence = %{public}d,\
394         len = %{public}d, uidNum = %{public}d, protocolIdNum = %{public}d, singleRemotePortNum = %{public}d,\
395         remotePortRangeNum = %{public}d, ipv4Num = %{public}d, ipv6Num = %{public}d",
396         addRoutePara.netId, addRoutePara.urspPrecedence, addRoutePara.len, addRoutePara.uidNum,
397         addRoutePara.protocolIdNum, addRoutePara.singleRemotePortNum, addRoutePara.remotePortRangeNum,
398         addRoutePara.ipv4Num, addRoutePara.ipv6Num);
399     std::vector<uint8_t> buffer;
400     if (!FillRoutePara(buffer, addRoutePara)) {
401         return;
402     }
403     for (int i = 0; i < addRoutePara.uidNum; i++) {
404         NETMGR_EXT_LOG_I("Need bindUidProcessToNetworkForDns");
405     }
406     int startIndex = 0;
407     short type = GetShort(startIndex, buffer);
408     short len = GetShort(startIndex, buffer);
409     std::vector<uint8_t> msgData;
410     for (int i = startIndex; i < (int)buffer.size(); ++i) {
411         msgData.push_back(buffer[i]);
412     }
413     std::unique_ptr<char[]> requestbuffer = std::make_unique<char[]>(len);
414     const auto &requestMsg = reinterpret_cast<KernelBindMsg *>(requestbuffer.get());
415     requestMsg->type = type;
416     requestMsg->len = len;
417     if (memcpy_s(reinterpret_cast<char *>(requestMsg->buf), len, msgData.data(), len) != EOK) {
418         NETMGR_EXT_LOG_E("BindProcessToNetworkByFullPara memcpy_s error");
419     }
420     int ret = DelayedSingleton<NetworkSliceKernelProxy>::GetInstance()->SendDataToKernel(
421         reinterpret_cast<KernelMsg &>(*requestMsg));
422     if (ret != 0) {
423         return;
424     }
425     if (addRoutePara.uidNum > 0) {
426         NETMGR_EXT_LOG_I("Need clearDnsCache");
427     }
428 }
429 
GetUidArray(std::string uids)430 std::vector<int> NetworkSliceManager::GetUidArray(std::string uids)
431 {
432     std::vector<std::string> stringUidArrays;
433     int uidNum = 0;
434     std::vector<int> uidArrays = std::vector<int>();
435     if (!uids.empty()) {
436         stringUidArrays = Split(uids, COMMA_SEPARATOR);
437         for (int i = 0; i < (int)stringUidArrays.size(); ++i) {
438             int uid = std::stoi(stringUidArrays[i]);
439             uidArrays.push_back(uid);
440             uidNum++;
441         }
442     }
443     return uidArrays;
444 }
445 
GetPrecedenceArray(std::string precedences)446 std::vector<int> NetworkSliceManager::GetPrecedenceArray(std::string precedences)
447 {
448     std::vector<std::string> precedencesString;
449     int precedenceNum = 0;
450     std::vector<int> precedenceArray = std::vector<int>();
451     if (!precedences.empty()) {
452         precedencesString = Split(precedences, COMMA_SEPARATOR);
453         precedenceNum = (int)precedencesString.size();
454         for (int i = 0; i < precedenceNum; ++i) {
455             int precedence = std::stoi(precedencesString[i]);
456             precedenceArray.push_back(precedence);
457         }
458     }
459     return precedenceArray;
460 }
461 
GetUidRoutePara(AddRoutePara & addRoutePara,std::map<std::string,std::string> & data)462 bool NetworkSliceManager::GetUidRoutePara(AddRoutePara& addRoutePara, std::map<std::string, std::string>& data)
463 {
464     std::string uids;
465     if (data.find("uids") != data.end()) {
466         uids = data["uids"];
467     }
468     NETMGR_EXT_LOG_I("GetUidRoutePara uids = %{public}s", uids.c_str());
469     if (!uids.empty()) {
470         std::vector<std::string> stringUidArrays = Split(uids, COMMA_SEPARATOR);
471         addRoutePara.uidNum = (int)stringUidArrays.size();
472         for (int i = 0; i < addRoutePara.uidNum; i++) {
473             if (!stringUidArrays[i].empty()) {
474                 addRoutePara.uidArrays.push_back(std::stoi(stringUidArrays[i]));
475                 NETMGR_EXT_LOG_I("addRoutePara.uidArrays[%{public}d] = %{public}d", i, addRoutePara.uidArrays[i]);
476             }
477         }
478     }
479     return true;
480 }
481 
GetRoutePara(AddRoutePara & addRoutePara,std::map<std::string,std::string> & data)482 bool NetworkSliceManager::GetRoutePara(AddRoutePara& addRoutePara, std::map<std::string, std::string>& data)
483 {
484     if (!GetUidRoutePara(addRoutePara, data)) {
485         return false;
486     }
487     if (data.find("ipv4Num") != data.end()) {
488         addRoutePara.ipv4Num = ConvertInt2UnsignedByte(std::stoi(data["ipv4Num"]));
489     }
490     if (data.find("ipv4AddrAndMask") != data.end()) {
491         addRoutePara.ipv4AddrAndMasks = ConvertstringTouInt8Vector(data["ipv4AddrAndMask"]);
492     } else {
493         addRoutePara.ipv4AddrAndMasks.clear();
494     }
495     if (addRoutePara.ipv4Num != 0) {
496         if (addRoutePara.ipv4AddrAndMasks.empty() || addRoutePara.ipv4AddrAndMasks.size() !=
497         (NetworkSliceCommConfig::LEN_INT + NetworkSliceCommConfig::LEN_INT) * addRoutePara.ipv4Num) {
498             NETMGR_EXT_LOG_E("ipv4Num not match, ipv4Num = %{public}d", addRoutePara.ipv4Num);
499             return false;
500         }
501     }
502     if (data.find("ipv6Num") != data.end()) {
503         addRoutePara.ipv6Num = ConvertInt2UnsignedByte(std::stoi(data["ipv6Num"]));
504     }
505     if (data.find("ipv6AddrAndPrefix") != data.end()) {
506         addRoutePara.ipv6AddrAndPrefixs = ConvertstringTouInt8Vector(data["ipv6AddrAndPrefix"]);
507     } else {
508         addRoutePara.ipv6AddrAndPrefixs.clear();
509     }
510     if (addRoutePara.ipv6Num != 0) {
511         if (addRoutePara.ipv6AddrAndPrefixs.empty() || addRoutePara.ipv6AddrAndPrefixs.size() !=
512         (NetworkSliceCommConfig::LEN_SIXTEEN_BYTE + NetworkSliceCommConfig::LEN_BYTE) * addRoutePara.ipv6Num) {
513             NETMGR_EXT_LOG_E("ipv6Num not match, ipv4Num = %{public}d", addRoutePara.ipv6Num);
514             return false;
515         }
516     }
517     GetRouteParaEx(addRoutePara, data);
518     return CalculateParaLen(addRoutePara);
519 }
520 
GetRouteParaEx(AddRoutePara & addRoutePara,std::map<std::string,std::string> & data)521 void NetworkSliceManager::GetRouteParaEx(AddRoutePara& addRoutePara, std::map<std::string, std::string>& data)
522 {
523     if (data.find("protocolIds") != data.end()) {
524         std::string protocolIds = data["protocolIds"];
525         if (!protocolIds.empty()) {
526             addRoutePara.protocolIdArrays = Split(protocolIds, COMMA_SEPARATOR);
527             addRoutePara.protocolIdNum = (int)addRoutePara.protocolIdArrays.size();
528         }
529     }
530     if (data.find("remotePorts") != data.end() && !data["remotePorts"].empty()) {
531         std::string remotePorts = data["remotePorts"];
532         addRoutePara.remotePortsArrays = Split(remotePorts, COMMA_SEPARATOR);
533         addRoutePara.remotePortNum = (int)addRoutePara.remotePortsArrays.size();
534         for (int i = 0; i < addRoutePara.remotePortNum; i++) {
535             if (addRoutePara.remotePortsArrays[i].find("-") != std::string::npos) {
536                 addRoutePara.remotePortRangeNum++;
537             }
538         }
539         addRoutePara.singleRemotePortNum = addRoutePara.remotePortNum - addRoutePara.remotePortRangeNum;
540     }
541     if (data.find("netId") != data.end()) {
542         addRoutePara.netId = std::stoi(data["netId"]);
543     }
544     if (data.find("urspPrecedence") != data.end()) {
545         addRoutePara.urspPrecedence = ConvertInt2UnsignedByte(std::stoi(data["urspPrecedence"]));
546     }
547 }
548 
CalculateParaLen(AddRoutePara & addRoutePara)549 bool NetworkSliceManager::CalculateParaLen(AddRoutePara& addRoutePara)
550 {
551     /*
552         * len = type + len
553         * + netId
554         * + precedence
555         * + uid num + uid
556         * + ipv4 num + ipv4
557         * + ipv6 num + ipv6
558         * + protocol num + protocol
559         * + singleRemotePort num + singleRemotePort
560         * + remotePortRange num + remotePortRange
561         */
562     int totalLen = NetworkSliceCommConfig::LEN_SHORT + NetworkSliceCommConfig::LEN_SHORT
563         + NetworkSliceCommConfig::LEN_INT
564         + NetworkSliceCommConfig::LEN_BYTE
565         + NetworkSliceCommConfig::LEN_BYTE + NetworkSliceCommConfig::LEN_INT * addRoutePara.uidNum
566         + NetworkSliceCommConfig::LEN_BYTE
567         + (NetworkSliceCommConfig::LEN_INT + NetworkSliceCommConfig::LEN_INT) * addRoutePara.ipv4Num
568         + NetworkSliceCommConfig::LEN_BYTE
569         + (NetworkSliceCommConfig::LEN_SIXTEEN_BYTE + NetworkSliceCommConfig::LEN_BYTE) * addRoutePara.ipv6Num
570         + NetworkSliceCommConfig::LEN_BYTE
571         + NetworkSliceCommConfig::LEN_BYTE * addRoutePara.protocolIdNum
572         + NetworkSliceCommConfig::LEN_BYTE
573         + NetworkSliceCommConfig::LEN_SHORT * addRoutePara.singleRemotePortNum
574         + NetworkSliceCommConfig::LEN_BYTE
575         + NetworkSliceCommConfig::LEN_INT * addRoutePara.remotePortRangeNum;
576 
577     if (totalLen > CONVERT_INT_AND_SHORT) {
578         return false;
579     }
580     addRoutePara.len = (short) totalLen;
581     return true;
582 }
583 
FillRoutePara(std::vector<uint8_t> & buffer,AddRoutePara addRoutePara)584 bool NetworkSliceManager::FillRoutePara(std::vector<uint8_t>& buffer, AddRoutePara addRoutePara)
585 {
586     PutShort(buffer, KERNEL_BIND_UID_MSG);
587     PutShort(buffer, addRoutePara.len);
588     PutInt(buffer, addRoutePara.netId, false);
589     buffer.push_back(addRoutePara.urspPrecedence);
590     buffer.push_back(ConvertInt2UnsignedByte(addRoutePara.uidNum));
591     for (int i = 0; i < addRoutePara.uidNum; i++) {
592         PutInt(buffer, addRoutePara.uidArrays[i], false);
593     }
594     buffer.push_back(addRoutePara.ipv4Num);
595     if (addRoutePara.ipv4Num != 0) {
596         buffer.insert(buffer.end(), addRoutePara.ipv4AddrAndMasks.begin(), addRoutePara.ipv4AddrAndMasks.end());
597     }
598     buffer.push_back(addRoutePara.ipv6Num);
599     if (addRoutePara.ipv6Num != 0) {
600         buffer.insert(buffer.end(), addRoutePara.ipv6AddrAndPrefixs.begin(), addRoutePara.ipv6AddrAndPrefixs.end());
601     }
602     buffer.push_back(ConvertInt2UnsignedByte(addRoutePara.protocolIdNum));
603     for (int i = 0; i < addRoutePara.protocolIdNum; i++) {
604         buffer.push_back(ConvertInt2UnsignedByte(std::stoi(addRoutePara.protocolIdArrays[i])));
605     }
606     buffer.push_back(ConvertInt2UnsignedByte(addRoutePara.singleRemotePortNum));
607     for (int i = 0; i < addRoutePara.remotePortNum; i++) {
608         if (addRoutePara.remotePortsArrays[i].find("-") == std::string::npos) {
609             continue;
610         }
611         int singleRemotePort = std::stoi(addRoutePara.remotePortsArrays[i]);
612         NETMGR_EXT_LOG_I("FillRoutePara singleRemotePort = %{public}d", ConvertInt2UnsignedShort(singleRemotePort));
613         PutShort(buffer, ConvertInt2UnsignedShort(singleRemotePort), false);
614     }
615 
616     buffer.push_back(ConvertInt2UnsignedByte(addRoutePara.remotePortRangeNum));
617     for (int i = 0; i < addRoutePara.remotePortNum; i++) {
618         if (addRoutePara.remotePortsArrays[i].find("-") == std::string::npos) {
619             continue;
620         }
621         std::string remotePortRange = addRoutePara.remotePortsArrays[i];
622         std::vector<std::string> remotePortRangeArrays = Split(remotePortRange, "-");
623         NETMGR_EXT_LOG_I("FillRoutePara RemotePortRange = %{public}d - %{public}d",
624             ConvertInt2UnsignedShort(std::stoi(remotePortRangeArrays[0])),
625             ConvertInt2UnsignedShort(std::stoi(remotePortRangeArrays[1])));
626         PutShort(buffer, ConvertInt2UnsignedShort(std::stoi(remotePortRangeArrays[0])), false);
627         PutShort(buffer, ConvertInt2UnsignedShort(std::stoi(remotePortRangeArrays[1])), false);
628     }
629     return true;
630 }
631 
DeleteNetworkBindByFullPara(std::shared_ptr<std::map<std::string,std::string>> msg)632 void NetworkSliceManager::DeleteNetworkBindByFullPara(std::shared_ptr<std::map<std::string, std::string>> msg)
633 {
634     if (!msg) {
635         NETMGR_EXT_LOG_E("nullptr");
636         return;
637     }
638     NETMGR_EXT_LOG_I("NetworkSliceManager::DeleteNetworkBindByFullPara");
639     std::map<std::string, std::string> data = *(msg.get());
640     if (data.empty()) {
641         NETMGR_EXT_LOG_E("data is null in deleteNetworkBind");
642         return;
643     }
644     int type = -1;
645     if (data.find("type") != data.end()) {
646         type = std::stoi(data["type"]);
647     }
648     if (type < DEL_BIND_ALL || type > DEL_BIND_PRECEDENCE) {
649         NETMGR_EXT_LOG_E("invalid type");
650         return;
651     }
652     std::string uids;
653     if (data.find("uids") != data.end()) {
654         uids = data["uids"];
655     }
656     std::vector<int> uidArrays = GetUidArray(uids);
657     int uidNum = 0;
658     if (!uidArrays.empty()) {
659         uidNum = (int)uidArrays.size();
660     }
661     for (int i = 0; i < uidNum; i++) {
662         NETMGR_EXT_LOG_I("Need bindUidProcessToNetworkForDns");
663     }
664     if (uidNum > 0) {
665         NETMGR_EXT_LOG_I("Need clearDnsCache");
666     }
667     std::string precedences;
668     if (data.find("urspPrecedence") != data.end()) {
669         precedences = data["urspPrecedence"];
670     }
671     std::vector<int> precedenceArray = GetPrecedenceArray(precedences);
672     int precedenceNum = 0;
673     if (!precedenceArray.empty()) {
674         precedenceNum = (int)precedenceArray.size();
675     }
676     /*
677     * len equals 2B dataType + 2B len + 4B delType + 4B netId + 4B precedenceNum + 4B * precedenceNum
678     * + 4B uidNum + 4 * uidNum
679     */
680     short len = (short) (2 + 2 + 4 + 4 + 4 + (4 * precedenceNum) + 4 + (4 * uidNum));
681     FillDeletePara(len, type, precedenceArray, uidArrays, data);
682 }
683 
FillDeletePara(short len,int type,std::vector<int> precedenceArray,std::vector<int> uidArrays,std::map<std::string,std::string> data)684 void NetworkSliceManager::FillDeletePara(short len, int type, std::vector<int> precedenceArray,
685     std::vector<int> uidArrays, std::map<std::string, std::string> data)
686 {
687     int precedenceNum = 0;
688     if (!precedenceArray.empty()) {
689         precedenceNum = (int)precedenceArray.size();
690     }
691     int uidNum = 0;
692     if (!uidArrays.empty()) {
693         uidNum = (int)uidArrays.size();
694     }
695     std::vector<uint8_t> buffer;
696     PutInt(buffer, type, false);
697     int netId = -1;
698     if (data.find("netId") != data.end()) {
699         netId = std::stoi(data["netId"]);
700         PutInt(buffer, netId, false);
701     }
702     PutInt(buffer, precedenceNum, false);
703     for (int i = 0; i < precedenceNum; i++) {
704         PutInt(buffer, precedenceArray[i], false);
705     }
706     PutInt(buffer, uidNum, false);
707     for (int i = 0; i < uidNum; i++) {
708         PutInt(buffer, uidArrays[i], false);
709     }
710     NETMGR_EXT_LOG_I("DeleteNetworkBindByFullPara, len = %{public}d, netId = %{public}d, uidNum = %{public}d, \
711         precedenceNum = %{public}d, delType = %{public}d", len, netId, uidNum, precedenceNum, type);
712 
713     std::unique_ptr<char[]> requestbuffer = std::make_unique<char[]>(len);
714     const auto &requestMsg = reinterpret_cast<KernelBindMsg *>(requestbuffer.get());
715     requestMsg->type = KERNEL_DEL_UID_BIND_MSG;
716     requestMsg->len = len;
717     if (memcpy_s(reinterpret_cast<char *>(requestMsg->buf), len, buffer.data(), len) != EOK) {
718         NETMGR_EXT_LOG_E("DeleteNetworkBindByFullPara memcpy_s error");
719     }
720     int ret = DelayedSingleton<NetworkSliceKernelProxy>::GetInstance()->SendDataToKernel(
721         reinterpret_cast<KernelMsg &>(*requestMsg));
722     if (ret < 0) {
723         NETMGR_EXT_LOG_E("SendDataToKernel : DeleteNetworkBindByFullPara failed");
724     }
725 }
726 
IpParaReportControl()727 void NetworkSliceManager::IpParaReportControl()
728 {
729     NETMGR_EXT_LOG_I("IpParaReportControl");
730     bool isMeetConditions = isMeetNetworkSliceConditions();
731     if (isMeetConditions == mIsIpParaReportEnable) {
732         return;
733     }
734     mIsIpParaReportEnable = isMeetConditions;
735     int enable = isMeetConditions ? 1 : 0;
736     NETMGR_EXT_LOG_I("IpParaReportControl %{public}d", enable);
737     // type + len + enable equals 12
738     short len = 12;
739     KernelIpRptEnableMsg msgData;
740     msgData.type = IP_PARA_REPORT_CONTROL_MSG;
741     msgData.len = len;
742     msgData.isEnable = enable;
743     int32_t ret = DelayedSingleton<NetworkSliceKernelProxy>::GetInstance()->SendDataToKernel(
744         reinterpret_cast<KernelMsg&>(msgData));
745     if (ret < 0) {
746         NETMGR_EXT_LOG_E("SendDataToKernel : send ipParaReport failed");
747     }
748 }
749 
GetRouteSelectionDescriptorByAppDescriptor(const std::shared_ptr<GetSlicePara> & getSlicePara)750 void NetworkSliceManager::GetRouteSelectionDescriptorByAppDescriptor(const std::shared_ptr<GetSlicePara>& getSlicePara)
751 {
752     NETMGR_EXT_LOG_I("GetRouteSelectionDescriptorByAppDescriptor");
753     if (!isMeetNetworkSliceConditions()) {
754         NotifySlicePara(getSlicePara);
755         return;
756     }
757     if (getSlicePara->data.empty()) {
758         NETMGR_EXT_LOG_I("input data is null");
759         NotifySlicePara(getSlicePara);
760         return;
761     }
762     AppDescriptor appDescriptor;
763     if (!GetAppDescriptor(getSlicePara->data, appDescriptor)) {
764         NotifySlicePara(getSlicePara);
765         return;
766     }
767     if (sUrspConfig_ == nullptr || sNrUnsolicitedMsgParser_ == nullptr) {
768         NETMGR_EXT_LOG_E("getRouteSelectionDescriptorByAppDescriptor fail, params null");
769         NotifySlicePara(getSlicePara);
770         return;
771     }
772     std::string plmn = sNrUnsolicitedMsgParser_->GetHplmn();
773     NETMGR_EXT_LOG_I("getRouteSelectionDescriptorByAppDescriptor, plmn = %{public}s", plmn.c_str());
774     SelectedRouteDescriptor routeRule;
775     if (!sUrspConfig_->SliceNetworkSelection(routeRule, plmn, appDescriptor)) {
776         NETMGR_EXT_LOG_E("getRouteSelectionDescriptorByAppDescriptor fail, routeRule = null");
777         NotifySlicePara(getSlicePara);
778         return;
779     }
780     DumpSelectedRouteDescriptor(routeRule);
781     FillRouteSelectionDescriptor(getSlicePara->ret, routeRule);
782     NotifySlicePara(getSlicePara);
783 }
784 
HandleIpv4Rpt(int & startIndex,const std::vector<uint8_t> & buffer,std::map<std::string,std::string> & bundle,AppDescriptor & appDescriptor)785 void NetworkSliceManager::HandleIpv4Rpt(int& startIndex, const std::vector<uint8_t>& buffer,
786     std::map<std::string, std::string>& bundle, AppDescriptor& appDescriptor)
787 {
788     if (buffer.size() < NetworkSliceCommConfig::LEN_INT) {
789         NETMGR_EXT_LOG_E("get Ipv4Addr, buffer.size() < NetworkSliceCommConfig::LEN_INT");
790         return;
791     }
792     std::vector<uint8_t> ipv4Addr_vec;
793     for (size_t i = 0; i < NetworkSliceCommConfig::LEN_INT; ++i) {
794         ipv4Addr_vec.push_back(buffer[startIndex + NetworkSliceCommConfig::LEN_INT - i - 1]); // Litter Endian
795     }
796     startIndex += NetworkSliceCommConfig::LEN_INT;
797     appDescriptor.setIpv4Addr(vectorToUint32(ipv4Addr_vec));
798     bundle["ip"] = std::to_string(appDescriptor.getIpv4Addr());
799 
800     if ((buffer.size() - startIndex) < NetworkSliceCommConfig::LEN_THREE_BYTE) {
801         NETMGR_EXT_LOG_E("get len, buffer.size() < NetworkSliceCommConfig::LEN_THREE_BYTE");
802         return;
803     }
804     short remotePort = GetShort(startIndex, buffer, true);
805     appDescriptor.setRemotePort(ConvertUnsignedShort2Int(remotePort));
806     uint8_t protocolId = buffer[startIndex++];
807     appDescriptor.setProtocolId(static_cast<int>(protocolId));
808 
809     DumpAppDescriptor(appDescriptor);
810 
811     bundle["remotePort"] = std::to_string(appDescriptor.getRemotePort());
812     bundle["protocolId"] = std::to_string(appDescriptor.getProtocolId());
813 
814     SendIpPara(appDescriptor, bundle);
815 }
816 
HandleIpv6Rpt(int & startIndex,const std::vector<uint8_t> & buffer,std::map<std::string,std::string> & bundle,AppDescriptor & appDescriptor)817 void NetworkSliceManager::HandleIpv6Rpt(int& startIndex, const std::vector<uint8_t>& buffer,
818     std::map<std::string, std::string>& bundle, AppDescriptor& appDescriptor)
819 {
820     if (buffer.size() < NetworkSliceCommConfig::LEN_SIXTEEN_BYTE) {
821         NETMGR_EXT_LOG_E("get Ipv6Addr, buffer.size() < NetworkSliceCommConfig::LEN_SIXTEEN_BYTE");
822         return;
823     }
824     std::array<uint8_t, NetworkSliceCommConfig::LEN_IPV6ADDR> ipv6Addr_vec;
825     for (size_t i = 0; i < NetworkSliceCommConfig::LEN_SIXTEEN_BYTE; ++i) {
826         ipv6Addr_vec[i] = buffer[startIndex + NetworkSliceCommConfig::LEN_SIXTEEN_BYTE - i - 1];
827     }
828     startIndex += NetworkSliceCommConfig::LEN_SIXTEEN_BYTE;
829     appDescriptor.setIpv6Addr(ipv6Addr_vec);
830     bundle["ip"] = transIpv6AddrToStr(appDescriptor.getIpv6Addr());
831 
832     if ((buffer.size() - startIndex) < NetworkSliceCommConfig::LEN_THREE_BYTE) {
833         NETMGR_EXT_LOG_E("get len, buffer.size() < NetworkSliceCommConfig::LEN_THREE_BYTE");
834         return;
835     }
836     short remotePort = GetShort(startIndex, buffer, true);
837     appDescriptor.setRemotePort(ConvertUnsignedShort2Int(remotePort));
838     uint8_t protocolId = buffer[startIndex++];
839     appDescriptor.setProtocolId(static_cast<int>(protocolId));
840     DumpAppDescriptor(appDescriptor);
841     bundle["remotePort"] = std::to_string(appDescriptor.getRemotePort());
842     bundle["protocolId"] = std::to_string(appDescriptor.getProtocolId());
843     SendIpPara(appDescriptor, bundle);
844 }
845 
SendIpPara(AppDescriptor appDescriptor,std::map<std::string,std::string> bundle)846 void NetworkSliceManager::SendIpPara(AppDescriptor appDescriptor, std::map<std::string, std::string> bundle)
847 {
848     if (sUrspConfig_ == nullptr || sNrUnsolicitedMsgParser_ == nullptr) {
849         NETMGR_EXT_LOG_E("sendIpPara fail, param null");
850         return;
851     }
852     std::string plmn = sNrUnsolicitedMsgParser_->GetHplmn();
853     if (!sUrspConfig_->isIpThreeTuplesInWhiteList(plmn, appDescriptor)) {
854         NETMGR_EXT_LOG_I("Ip Three Tuples not In WhiteList");
855         return;
856     }
857     DelayedSingleton<HwNetworkSliceManager>::GetInstance()->HandleIpReport(bundle);
858 }
859 
isMeetNetworkSliceConditions()860 bool NetworkSliceManager::isMeetNetworkSliceConditions()
861 {
862     if (!isNrSlicesSupported()) {
863         NETMGR_EXT_LOG_I("UE not support nr slices");
864         return false;
865     }
866     if (!hasAvailableUrspRule()) {
867         NETMGR_EXT_LOG_I("do not have available ursp rule");
868         return false;
869     }
870     if (!isSaState()) {
871         NETMGR_EXT_LOG_I("Rat is not 5G");
872         return false;
873     }
874     if (isAirPlaneModeOn()) {
875         NETMGR_EXT_LOG_I("Air plane mode on");
876         return false;
877     }
878     if (isWifiConnected()) {
879         NETMGR_EXT_LOG_I("WiFi is connected");
880         return false;
881     }
882     if (!isScreenOn()) {
883         NETMGR_EXT_LOG_I("Out of screen");
884         return false;
885     }
886     if (isInVpnMode()) {
887         NETMGR_EXT_LOG_I("VPN on");
888         return false;
889     }
890     if (!isDefaultDataOnMainCard()) {
891         NETMGR_EXT_LOG_I("Default data is not main card");
892         return false;
893     }
894     return true;
895 }
896 
isCanRequestNetwork()897 bool NetworkSliceManager::isCanRequestNetwork()
898 {
899     if (isMobileDataClose()) {
900         NETMGR_EXT_LOG_I("isMobileDataClose");
901         return false;
902     }
903     if (isAirPlaneModeOn()) {
904         NETMGR_EXT_LOG_I("isAirPlaneModeOn");
905         return false;
906     }
907     if (isWifiConnected()) {
908         NETMGR_EXT_LOG_I("isWifiConnected");
909         return false;
910     }
911     if (!isSaState()) {
912         NETMGR_EXT_LOG_I("!isSaState()");
913         return false;
914     }
915     if (!isDefaultDataOnMainCard()) {
916         NETMGR_EXT_LOG_I("!isDefaultDataOnMainCard()");
917         return false;
918     }
919     if (isInVpnMode()) {
920         NETMGR_EXT_LOG_I("isInVpnMode");
921         return false;
922     }
923     return true;
924 }
925 
NotifySlicePara(const std::shared_ptr<GetSlicePara> & getSlicePara)926 void NetworkSliceManager::NotifySlicePara(const std::shared_ptr<GetSlicePara>& getSlicePara)
927 {
928     if (getSlicePara == nullptr) {
929         return;
930     }
931     getSlicePara->isDone = true; // Update the status
932 }
933 
SetAppId(AppDescriptor & appDescriptor,const std::vector<std::string> & values,const std::string & appId)934 void NetworkSliceManager::SetAppId(AppDescriptor& appDescriptor,
935     const std::vector<std::string>& values, const std::string& appId)
936 {
937     if (values.size() == APPID_OSID_SIZE) {
938         std::string osId = values[0];
939         std::string app = values[1];
940         appDescriptor.setOsAppId(osId, app);
941     } else {
942         appDescriptor.setOsAppId("", appId);
943         NETMGR_EXT_LOG_E("osid is empty");
944     }
945 }
946 
GetAppDescriptor(std::map<std::string,std::string> & data,AppDescriptor & appDescriptor)947 bool NetworkSliceManager::GetAppDescriptor(std::map<std::string, std::string>& data, AppDescriptor& appDescriptor)
948 {
949     if (data.empty()) {
950         return false;
951     }
952     if (data.find("appId") != data.end()) {
953         std::string appId = data["appId"];
954         std::vector<std::string> values;
955         values = Split(appId, "#");
956         if (values.size() > SIZE_TWO || appId.empty()) {
957             return false;
958         }
959         SetAppId(appDescriptor, values, appId);
960     }
961     if (data.find("dnn") != data.end()) {
962         appDescriptor.setDnn(data["dnn"]);
963     }
964     if (data.find("fqdn") != data.end()) {
965         appDescriptor.setFqdn(data["fqdn"]);
966     }
967     if (data.find("ip") != data.end()) {
968         std::string ipAddr = data["ip"];
969         if (ipAddr.size() == NetworkSliceCommConfig::LEN_INT) {
970             uint32_t ipv4Address = inet_addr(ipAddr.c_str());
971             appDescriptor.setIpv4Addr(ipv4Address);
972         } else if (ipAddr.size() == NetworkSliceCommConfig::LEN_SIXTEEN_BYTE) {
973             struct in6_addr ipv6;
974             if (inet_pton(AF_INET6, ipAddr.c_str(), &ipv6) == 0) {
975                 NETMGR_EXT_LOG_E("ipv6 ==null || ipv6.length != NetworkSliceCommConfig::LEN_INT");
976                 return false;
977             }
978             appDescriptor.setIpv6Addr(*reinterpret_cast<std::array<uint8_t, BASE_16>*>(ipv6.s6_addr));
979         } else {
980             NETMGR_EXT_LOG_E("wrong ipAddr.length = %{public}d", (int)ipAddr.size());
981         }
982     }
983     if (data.find("protocolId") != data.end()) {
984         std::string protocolId = data["protocolId"];
985         if (!protocolId.empty()) {
986             appDescriptor.setProtocolId(std::stoi(protocolId));
987         }
988     }
989     if (data.find("remotePort") != data.end()) {
990         std::string remotePort = data["remotePort"];
991         if (!remotePort.empty()) {
992             appDescriptor.setRemotePort(std::stoi(remotePort));
993         }
994     }
995     DumpAppDescriptor(appDescriptor);
996     return true;
997 }
998 
FillRouteSelectionDescriptor(std::map<std::string,std::string> & ret,SelectedRouteDescriptor routeRule)999 void NetworkSliceManager::FillRouteSelectionDescriptor(std::map<std::string, std::string>& ret,
1000     SelectedRouteDescriptor routeRule)
1001 {
1002     NETMGR_EXT_LOG_I("FillRouteSelectionDescriptor");
1003     ret["sscMode"] = std::to_string(routeRule.getSscMode());
1004     NETMGR_EXT_LOG_I("ret[sscMode] = %{public}s", ret["sscMode"].c_str());
1005     ret["sNssai"] = routeRule.getSnssai();
1006     NETMGR_EXT_LOG_I("ret[sNssai] = %{public}s", ret["sNssai"].c_str());
1007     if (routeRule.getPduSessionType() != -1) {
1008         ret["pduSessionType"] = std::to_string(routeRule.getPduSessionType());
1009         NETMGR_EXT_LOG_I("ret[pduSessionType] = %{public}s", ret["pduSessionType"].c_str());
1010     }
1011     if (routeRule.getDnn().length() != 0) {
1012         ret["dnn"] = routeRule.getDnn();
1013         NETMGR_EXT_LOG_I("ret[dnn] = %{public}s", ret["dnn"].c_str());
1014     }
1015     ret["routeBitmap"] = std::to_string(routeRule.getRouteBitmap());
1016     NETMGR_EXT_LOG_I("ret[routeBitmap] = %{public}s", ret["routeBitmap"].c_str());
1017     ret["urspPrecedence"] = std::to_string(routeRule.getUrspPrecedence());
1018     NETMGR_EXT_LOG_I("ret[urspPrecedence] = %{public}s", ret["urspPrecedence"].c_str());
1019     if (routeRule.getAppIds().length() != 0) {
1020         ret["appIds"] = routeRule.getAppIds();
1021         NETMGR_EXT_LOG_I("ret[appIds] = %{public}s", ret["appIds"].c_str());
1022     }
1023     if (routeRule.getProtocolIds().length() != 0) {
1024         ret["protocolIds"] = routeRule.getProtocolIds();
1025         NETMGR_EXT_LOG_I("ret[protocolIds] = %{public}s", ret["protocolIds"].c_str());
1026     }
1027     if (routeRule.getRemotePorts().length() != 0) {
1028         ret["remotePorts"] = routeRule.getRemotePorts();
1029         NETMGR_EXT_LOG_I("ret[remotePorts] = %{public}s", ret["remotePorts"].c_str());
1030     }
1031     if (routeRule.getIpv4Num() != 0) {
1032         ret["ipv4Num"] = std::to_string(routeRule.getIpv4Num());
1033         NETMGR_EXT_LOG_I("ret[ipv4Num] = %{public}s", ret["ipv4Num"].c_str());
1034         std::vector<uint8_t> Ipv4AddrAndMask = routeRule.getIpv4AddrAndMask();
1035         ret["ipv4AddrAndMask"] = std::string(reinterpret_cast<const char*>(Ipv4AddrAndMask.data()),
1036             Ipv4AddrAndMask.size());
1037     }
1038     if (routeRule.getIpv6Num() != 0) {
1039         ret["ipv6Num"] = std::to_string(routeRule.getIpv6Num());
1040         NETMGR_EXT_LOG_I("ret[ipv6Num] = %{public}s", ret["ipv6Num"].c_str());
1041         std::vector<uint8_t> Ipv6AddrAndPrefix = routeRule.getIpv6AddrAndPrefix();
1042         ret["ipv6AddrAndPrefix"] = std::string(reinterpret_cast<const char*>(Ipv6AddrAndPrefix.data()),
1043             Ipv6AddrAndPrefix.size());
1044     }
1045 }
1046 
hasAvailableUrspRule()1047 bool NetworkSliceManager::hasAvailableUrspRule()
1048 {
1049     if (sUrspConfig_ == nullptr) {
1050         return false;
1051     }
1052     return sUrspConfig_->hasAvailableUrspRule();
1053 }
1054 
isSaState()1055 bool NetworkSliceManager::isSaState()
1056 {
1057     return isSaState_;
1058 }
1059 
SetSaState(bool isSaState)1060 void NetworkSliceManager::SetSaState(bool isSaState)
1061 {
1062     isSaState_ = isSaState;
1063 }
1064 
isNrSlicesSupported()1065 bool NetworkSliceManager::isNrSlicesSupported()
1066 {
1067     bool isSupportNrSlice = system::GetBoolParameter(NETMANAGER_EXT_NETWORKSLICE_ABILITY, false);
1068     return isSupportNrSlice;
1069 }
1070 
isDefaultDataOnMainCard()1071 bool NetworkSliceManager::isDefaultDataOnMainCard()
1072 {
1073     bool isDefaultDataOnMainCard
1074         = (StateUtils::GetDefaultSlotId() == StateUtils::GetPrimarySlotId()) ? true : false;
1075     return isDefaultDataOnMainCard;
1076 }
1077 
isWifiConnected()1078 bool NetworkSliceManager::isWifiConnected()
1079 {
1080     return wifiConn_;
1081 }
1082 
isScreenOn()1083 bool NetworkSliceManager::isScreenOn()
1084 {
1085     return screenOn_;
1086 }
1087 
isAirPlaneModeOn()1088 bool NetworkSliceManager::isAirPlaneModeOn()
1089 {
1090     return airModeOn_;
1091 }
1092 
isInVpnMode()1093 bool NetworkSliceManager::isInVpnMode()
1094 {
1095     return vpnMode_;
1096 }
1097 
isMobileDataClose()1098 bool NetworkSliceManager::isMobileDataClose()
1099 {
1100     bool dataEnabled = false;
1101     Telephony::CellularDataClient::GetInstance().IsCellularDataEnabled(dataEnabled);
1102     if (dataEnabled) {
1103         return false;
1104     }
1105     return true;
1106 }
1107 
GetForeGroundAppUid()1108 int32_t NetworkSliceManager::GetForeGroundAppUid()
1109 {
1110     return foregroundApp_uid;
1111 }
1112 
isRouteRuleInForbiddenList(const SelectedRouteDescriptor & routeRule)1113 bool NetworkSliceManager::isRouteRuleInForbiddenList(const SelectedRouteDescriptor& routeRule)
1114 {
1115     for (size_t i = 0; i < mNormalForbiddenRules.size(); i++) {
1116         ForbiddenRouteDescriptor forbiddenRule = mNormalForbiddenRules[i];
1117         if (routeRule.getDnn() == forbiddenRule.getDnn()
1118             && routeRule.getSnssai() == forbiddenRule.getSnssai()
1119             && (routeRule.getPduSessionType() == forbiddenRule.getPduSessionType())
1120             && (routeRule.getSscMode() == forbiddenRule.getSscMode())) {
1121             return true;
1122         }
1123     }
1124     return false;
1125 }
1126 
GetRouteSelectionDescriptorByDNN(const std::string dnn,std::string & snssai,uint8_t & sscmode)1127 void NetworkSliceManager::GetRouteSelectionDescriptorByDNN(const std::string dnn, std::string& snssai, uint8_t& sscmode)
1128 {
1129     NETMGR_EXT_LOG_I("GetRouteSelectionDescriptorByDNN");
1130     if (!isMeetNetworkSliceConditions()) {
1131         return;
1132     }
1133     AppDescriptor appDescriptor;
1134     appDescriptor.setDnn(dnn);
1135     if (sUrspConfig_ == nullptr || sNrUnsolicitedMsgParser_ == nullptr) {
1136         NETMGR_EXT_LOG_E("GetRouteSelectionDescriptorByDNN fail, params null");
1137         return;
1138     }
1139     std::string plmn = sNrUnsolicitedMsgParser_->GetHplmn();
1140     NETMGR_EXT_LOG_I("GetRouteSelectionDescriptorByDNN, plmn = %{public}s", plmn.c_str());
1141     SelectedRouteDescriptor routeRule;
1142     if (!sUrspConfig_->SliceNetworkSelection(routeRule, plmn, appDescriptor)) {
1143         NETMGR_EXT_LOG_E("GetRouteSelectionDescriptorByDNN fail, routeRule = null");
1144         return;
1145     }
1146     sscmode = routeRule.getSscMode();
1147     snssai = routeRule.getSnssai();
1148 }
1149 
DumpAppDescriptor(AppDescriptor appDescriptor)1150 void NetworkSliceManager::DumpAppDescriptor(AppDescriptor appDescriptor)
1151 {
1152     NETMGR_EXT_LOG_I("dump AppDescriptor");
1153     uint32_t ipv4Addr = appDescriptor.getIpv4Addr();
1154     std::array<uint8_t, NetworkSliceCommConfig::LEN_IPV6ADDR> ipv6Addr = appDescriptor.getIpv6Addr();
1155     NETMGR_EXT_LOG_I("mAppDescriptor.mUid = %{public}d", appDescriptor.getUid());
1156     NETMGR_EXT_LOG_I("mAppDescriptor.mOsAppId.mAppId = %{public}s", appDescriptor.getOsAppId().getAppId().c_str());
1157     NETMGR_EXT_LOG_I("mAppDescriptor.mOsAppId.mOsId = %{public}s", appDescriptor.getOsAppId().getOsId().c_str());
1158     std::string ipv6 = transIpv6AddrToStr(appDescriptor.getIpv6Addr());
1159     NETMGR_EXT_LOG_I("mAppDescriptor.mIpv4Addr = %{public}d, mAppDescriptor.mIpv6Addr = %{public}s",
1160         appDescriptor.getIpv4Addr(), ipv6.c_str());
1161     NETMGR_EXT_LOG_I("mAppDescriptor.mProtocolId = %{public}d", appDescriptor.getProtocolId());
1162     NETMGR_EXT_LOG_I("mAppDescriptor.mRemotePort = %{public}d", appDescriptor.getRemotePort());
1163     NETMGR_EXT_LOG_I("mAppDescriptor.mDnn = %{public}s", appDescriptor.getDnn().c_str());
1164     NETMGR_EXT_LOG_I("mAppDescriptor.mFqdn = %{public}s", appDescriptor.getFqdn().c_str());
1165 }
1166 
DumpSelectedRouteDescriptor(SelectedRouteDescriptor routeRule)1167 void NetworkSliceManager::DumpSelectedRouteDescriptor(SelectedRouteDescriptor routeRule)
1168 {
1169     NETMGR_EXT_LOG_I("dump SelectedRouteDescriptor");
1170     NETMGR_EXT_LOG_I("routeRule.mSscMode = %{public}d, routeRule.mSNssai = %{public}s",
1171         routeRule.getSscMode(), routeRule.getSnssai().c_str());
1172     NETMGR_EXT_LOG_I("routeRule.mDnn = %{public}s, routeRule.mPduSessionType = %{public}d",
1173         routeRule.getDnn().c_str(), routeRule.getPduSessionType());
1174 }
1175 
1176 }
1177 }
1178 
1179