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