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