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