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 "networksliceutil.h"
16 #include "net_conn_client.h"
17 #include "networkslicemanager.h"
18 #include "net_conn_callback.h"
19 #include "parameters.h"
20 #include "hwnetworkslicemanager.h"
21
22 namespace OHOS {
23 namespace NetManagerStandard {
24 constexpr int MAX_NETWORK_SLICE = 6;
25 constexpr int CHANGE_TYPE_ZEROING = 0;
26 constexpr int CHANGE_TYPE_INCREASE = 1;
27 constexpr int CHANGE_TYPE_DECREASE = -1;
28 constexpr int INVALID_UID = -1;
29 constexpr int BINDNETWORKSLICESUCCESS = 0;
30 constexpr int ERROR_NO_SERVICE = -1;
31 constexpr int ERROR_INVALID_PARAM = -3;
32 constexpr int REQUEST_NETWORK_TIMEOUT = 10 * 1000;
33 constexpr int IPV4_LEN = 4;
34 constexpr int IPV6_LEN = 16;
35 const std::string NETMANAGER_EXT_NETWORKSLICE_ABILITY = "persist.netmgr_ext.networkslice";
36 static bool g_isNrSliceSupport = system::GetBoolParameter(NETMANAGER_EXT_NETWORKSLICE_ABILITY, false);
37 static std::string REQUEST_NETWORK_SLICE_OS_ID = "01020304050607080102030405060708#";
38 static std::string REQUEST_NETWORK_SLICE_APPID = "appId";
39 static std::string REQUEST_NETWORK_SLICE_UID = "uid";
40 static std::string REQUEST_NETWORK_SLICE_FQDN = "fqdn";
41 static std::string REQUEST_NETWORK_SLICE_DNN = "dnn";
42 static std::string REQUEST_NETWORK_SLICE_IP = "ip";
43 static std::string REQUEST_NETWORK_SLICE_PROTOCOL = "protocolId";
44 static std::string REQUEST_NETWORK_SLICE_REMOTE_PORT = "remotePort";
45 static std::string REQUEST_NETWORK_SLICE_CONNECTION_CAPABILITY = "connectionCapability";
46 static std::string BIND_ROUTE_UID = "uids";
47 static std::string BIND_ROUTE_URSP_PRECEDENCE = "urspPrecedence";
48 static std::string BIND_ROUTE_NETID = "netId";
49 static std::string BIND_ROUTE_IPV4_NUM = "ipv4Num";
50 static std::string BIND_ROUTE_IPV4_ADDRANDMASK = "ipv4AddrAndMask";
51 static std::string BIND_ROUTE_IPV6_NUM = "ipv6Num";
52 static std::string BIND_ROUTE_IPV6_ADDRANDPREFIX = "ipv6AddrAndPrefix";
53 static std::string BIND_ROUTE_PROTOCOL_IDS = "protocolIds";
54 static std::string BIND_ROUTE_REMOTE_PORTS = "remotePorts";
55 static std::string UNBIND_ROUTE_TYPE = "type";
56 static std::string SEPARATOR_FOR_NORMAL_DATA = ",";
57 constexpr int UNBIND_TYPE_ALL = 0;
58 constexpr int UNBIND_TYPE_NETID = 1;
59 constexpr int UNBIND_TYPE_UIDS = 2;
60
HwNetworkSliceManager()61 HwNetworkSliceManager::HwNetworkSliceManager() {}
62
~HwNetworkSliceManager()63 HwNetworkSliceManager::~HwNetworkSliceManager() {}
64
Init()65 void HwNetworkSliceManager::Init()
66 {
67 if (g_isNrSliceSupport == false) {
68 return;
69 }
70 InitNetworkSliceInfos();
71 }
72
InitNetworkSliceInfos()73 void HwNetworkSliceManager::InitNetworkSliceInfos()
74 {
75 NETMGR_EXT_LOG_I("HwNetworkSliceManager::InitNetworkSliceInfos");
76 for (int nc = NET_CAPABILITY_SNSSAI1; nc <= NET_CAPABILITY_SNSSAI6; nc++) {
77 sptr<NetSpecifier> request(new NetSpecifier());
78 request->SetCapability(static_cast<OHOS::NetManagerStandard::NetCap>(nc));
79 request->SetType(BEARER_CELLULAR);
80 std::shared_ptr<NetworkSliceInfo> networkSliceInfo = std::make_shared<NetworkSliceInfo>();
81 networkSliceInfo->setNetworkRequest(request);
82 networkSliceInfo->setNetworkCapability(nc);
83 mNetworkSliceInfos.emplace_back(networkSliceInfo);
84 }
85 ChangeNetworkSliceCounter(CHANGE_TYPE_ZEROING);
86 }
87
GetTrafficDescriptorWhiteList(TrafficDescriptorWhiteList whiteList)88 void HwNetworkSliceManager::GetTrafficDescriptorWhiteList(TrafficDescriptorWhiteList whiteList)
89 {
90 NETMGR_EXT_LOG_I("HwNetworkSliceManager::GetTrafficDescriptorWhiteList");
91 ReadAppIdWhiteList(whiteList);
92 ReadDnnWhiteList(whiteList);
93 ReadFqdnWhiteList(whiteList);
94 ReadCctWhiteList(whiteList);
95 }
96
HandleUrspChanged(std::map<std::string,std::string> data)97 void HwNetworkSliceManager::HandleUrspChanged(std::map<std::string, std::string> data)
98 {
99 NETMGR_EXT_LOG_I("HwNetworkSliceManager::HandleUrspChanged");
100 if (!g_isNrSliceSupport) {
101 NETMGR_EXT_LOG_E("requestNetworkSlice, current environment cannot match slices");
102 return;
103 }
104 if (data.empty()) {
105 NETMGR_EXT_LOG_E("handleUrspChanged, data is null");
106 return;
107 }
108 mIsReady.store(false, std::memory_order_relaxed);
109 mIsUrspAvailable = true;
110 CleanEnvironment();
111 RouteSelectionDescriptorInfo rsd = RouteSelectionDescriptorInfo::makeRouteSelectionDescriptor(data);
112 mIsReady.store(true, std::memory_order_relaxed);
113 TryToActivateSliceForForegroundApp();
114 if (!rsd.isMatchAll()) {
115 mHasMatchAllSlice.store(false, std::memory_order_relaxed);
116 return;
117 }
118 mHasMatchAllSlice.store(true, std::memory_order_relaxed);
119 std::shared_ptr<NetworkSliceInfo> networkSliceInfo =
120 GetNetworkSliceInfoByParaNull(NetworkSliceInfo::ParaType::ROUTE_SELECTION_DESCRIPTOR);
121 if (networkSliceInfo != nullptr) {
122 NETMGR_EXT_LOG_I("networkSliceInfo != null is true");
123 networkSliceInfo->setRouteSelectionDescriptor(rsd);
124 uint8_t route_bitmap = 0;
125 if (data.find(TrafficDescriptorsInfo::TDS_ROUTE_BITMAP) != data.end()) {
126 route_bitmap = std::stoi(data[TrafficDescriptorsInfo::TDS_ROUTE_BITMAP]);
127 }
128 networkSliceInfo->setTempTrafficDescriptors(TrafficDescriptorsInfo::Builder()
129 .setRouteBitmap(route_bitmap)
130 .build());
131 ChangeNetworkSliceCounter(CHANGE_TYPE_INCREASE);
132 }
133
134 NETMGR_EXT_LOG_I("match all slice start to active when ursp changed");
135
136 if (!isCanRequestNetwork()) {
137 NETMGR_EXT_LOG_E("handleUrspChanged can not request network");
138 return;
139 }
140 mIsMatchRequesting = true;
141 RequestNetwork(INVALID_UID, networkSliceInfo);
142 }
143
HandleIpReport(std::map<std::string,std::string> data)144 void HwNetworkSliceManager::HandleIpReport(std::map<std::string, std::string> data)
145 {
146 if (data.empty()) {
147 NETMGR_EXT_LOG_I("IP_REPORT data is null, return");
148 return;
149 }
150 int uid = std::stoi(data[REQUEST_NETWORK_SLICE_UID]);
151 std::string ip = data[REQUEST_NETWORK_SLICE_IP];
152 std::string protocolId = data[REQUEST_NETWORK_SLICE_PROTOCOL];
153 std::string remotePort = data[REQUEST_NETWORK_SLICE_REMOTE_PORT];
154 RequestNetworkSliceForIp(uid, ip, protocolId, remotePort);
155 }
156
TryToActivateSliceForForegroundApp()157 void HwNetworkSliceManager::TryToActivateSliceForForegroundApp()
158 {
159 NETMGR_EXT_LOG_I("TryToActivateSliceForForegroundApp");
160 int uid = DelayedSingleton<NetworkSliceManager>::GetInstance()->GetForeGroundAppUid();
161 if (uid == INVALID_UID) {
162 return;
163 }
164 std::string packageName;
165 int ret = DelayedSingleton<NetworkSliceService>::GetInstance()->GetBundleNameForUid(uid, packageName);
166 if (ret != NETMANAGER_EXT_SUCCESS) {
167 NETMGR_EXT_LOG_E("Error GetBundleNameForUid fail");
168 return;
169 }
170 NETMGR_EXT_LOG_I("TryToActivateSliceForForegroundApp uid = %{public}d, packagename = %{public}s",
171 uid, packageName.c_str());
172 if (packageName == "com.ohos.sceneboard") {
173 return;
174 }
175 RequestNetworkSliceForPackageName(uid, packageName);
176 }
177
178
RequestNetworkSliceForPackageName(int uid,std::string & packageName)179 void HwNetworkSliceManager::RequestNetworkSliceForPackageName(int uid, std::string& packageName)
180 {
181 NETMGR_EXT_LOG_I("RequestNetworkSliceForPackageName");
182 if (!isCanMatchNetworkSlices()) {
183 NETMGR_EXT_LOG_I("requestNetworkSlice, current environment cannot match slices");
184 return;
185 }
186
187 if (!isNeedToRequestSliceForAppIdAuto(packageName)) {
188 NETMGR_EXT_LOG_I("No need to requestNetwork for uid = %{public}d", uid);
189 return;
190 }
191
192 TrafficDescriptorsInfo td = TrafficDescriptorsInfo::Builder().setUid(uid).build();
193 std::shared_ptr<TrafficDescriptorsInfo> tdinfo = std::make_shared<TrafficDescriptorsInfo>(td);
194 std::shared_ptr<NetworkSliceInfo> networkSliceInfo = RequestNetworkSlice(tdinfo);
195 RequestNetwork(uid, networkSliceInfo);
196 }
197
RequestNetworkSliceForFqdn(int uid,std::string fqdn,std::list<AddrInfo> addresses)198 void HwNetworkSliceManager::RequestNetworkSliceForFqdn(int uid, std::string fqdn, std::list<AddrInfo> addresses)
199 {
200 if (!isCanMatchNetworkSlices()) {
201 NETMGR_EXT_LOG_D("requestNetworkSlice, current environment cannot match slices");
202 return;
203 }
204 if (addresses.size() == 0) {
205 NETMGR_EXT_LOG_D("requestNetworkSliceForFqdn ipAddresses is null.");
206 return;
207 }
208 if (!isNeedToRequestSliceForFqdnAuto(fqdn, uid)) {
209 NETMGR_EXT_LOG_D("requestNetworkSliceForFqdn No need to requestNetwork for uid = %{public}d", uid);
210 return;
211 }
212 std::set<INetAddr> ipv4;
213 std::set<INetAddr> ipv6;
214 for (auto &it : addresses) {
215 INetAddr ip;
216 ip.address_ = it.addr_;
217 ip.hostName_ = fqdn;
218 switch (it.type_) {
219 case 0:
220 ip.type_ = INetAddr::IPV4;
221 ipv4.insert(ip);
222 break;
223 case 1:
224 ip.type_ = INetAddr::IPV6;
225 ipv6.insert(ip);
226 break;
227 default:
228 NETMGR_EXT_LOG_E("ip length wrong, len = %{public}d", ip.prefixlen_);
229 }
230 }
231 FqdnIps fqdnIps;
232 fqdnIps.setIpv4Addr(ipv4);
233 fqdnIps.setIpv4Addr(ipv6);
234 TrafficDescriptorsInfo td = TrafficDescriptorsInfo::Builder().setUid(uid).setFqdn(fqdn).setFqdnIps(fqdnIps).build();
235 std::shared_ptr<TrafficDescriptorsInfo> tdinfo = std::make_shared<TrafficDescriptorsInfo>(td);
236 std::shared_ptr<NetworkSliceInfo> networkSliceInfo = RequestNetworkSlice(tdinfo);
237 RequestNetwork(uid, networkSliceInfo);
238 }
239
RequestNetworkSliceForIp(int uid,std::string ip,std::string protocolId,std::string remotePort)240 void HwNetworkSliceManager::RequestNetworkSliceForIp(int uid, std::string ip, std::string protocolId,
241 std::string remotePort)
242 {
243 if (!isCanMatchNetworkSlices()) {
244 NETMGR_EXT_LOG_D("requestNetworkSlice, current environment cannot match slices");
245 return;
246 }
247 INetAddr inetAddress;
248 inetAddress.address_ = ip;
249 TrafficDescriptorsInfo td = TrafficDescriptorsInfo::Builder().setUid(uid).setIp(inetAddress)
250 .setProtocolId(protocolId).setRemotePort(remotePort).build();
251 std::shared_ptr<TrafficDescriptorsInfo> tdinfo = std::make_shared<TrafficDescriptorsInfo>(td);
252 std::shared_ptr<NetworkSliceInfo> networkSliceInfo = RequestNetworkSlice(tdinfo);
253 RequestNetwork(uid, networkSliceInfo);
254 }
255
RequestNetworkSlice(std::shared_ptr<TrafficDescriptorsInfo> td)256 std::shared_ptr<NetworkSliceInfo> HwNetworkSliceManager::RequestNetworkSlice(std::shared_ptr<TrafficDescriptorsInfo> td)
257 {
258 NETMGR_EXT_LOG_I("HwNetworkSliceManager::RequestNetworkSlice");
259 if (td == nullptr) {
260 NETMGR_EXT_LOG_I("requestNetworkSlice, the TrafficDescriptorsInfo is null");
261 return nullptr;
262 }
263 std::shared_ptr<GetSlicePara> getSlicePara = std::make_shared<GetSlicePara>();
264 getSlicePara->data = FillNetworkSliceRequest(td);
265 DelayedSingleton<NetworkSliceManager>::GetInstance()->GetRouteSelectionDescriptorByAppDescriptor(getSlicePara);
266 std::map<std::string, std::string> result = getSlicePara->ret;
267 if (result.size() == 0) {
268 NETMGR_EXT_LOG_E("can't get network slice");
269 return nullptr;
270 }
271
272 RouteSelectionDescriptorInfo rsd = RouteSelectionDescriptorInfo::makeRouteSelectionDescriptor(result);
273 TrafficDescriptorsInfo tds = TrafficDescriptorsInfo::makeTrafficDescriptorsInfo(result);
274 std::shared_ptr<NetworkSliceInfo> requestAgain =
275 GetNetworkSliceInfoByParaRsd(rsd, NetworkSliceInfo::ParaType::ROUTE_SELECTION_DESCRIPTOR);
276 if (requestAgain != nullptr) {
277 std::shared_ptr<TrafficDescriptorsInfo> tdsInUrsp = std::make_shared<TrafficDescriptorsInfo>(tds);
278 return HandleRsdRequestAgain(requestAgain, td, tdsInUrsp);
279 }
280 if (isUpToToplimit()) {
281 NETMGR_EXT_LOG_I("already has 6 network slices, do not request again. uid = %{public}d", td->getUid());
282 return nullptr;
283 }
284 std::shared_ptr<NetworkSliceInfo> networkSliceInfo =
285 GetNetworkSliceInfoByParaNull(NetworkSliceInfo::ParaType::ROUTE_SELECTION_DESCRIPTOR);
286 if (networkSliceInfo != nullptr) {
287 networkSliceInfo->setRouteSelectionDescriptor(rsd);
288 networkSliceInfo->cacheTrafficDescriptors(tds);
289 networkSliceInfo->setTempTrafficDescriptors(tds);
290 ChangeNetworkSliceCounter(CHANGE_TYPE_INCREASE);
291 if (tds.isMatchFqdn()) {
292 networkSliceInfo->setFqdnIps(td->getFqdnIps(), tds);
293 }
294 NETMGR_EXT_LOG_I("Slice network has binded.");
295 }
296 return networkSliceInfo;
297 }
298
HandleRsdRequestAgain(std::shared_ptr<NetworkSliceInfo> requestAgain,std::shared_ptr<TrafficDescriptorsInfo> requestTd,std::shared_ptr<TrafficDescriptorsInfo> tdsInUrsp)299 std::shared_ptr<NetworkSliceInfo> HwNetworkSliceManager::HandleRsdRequestAgain(
300 std::shared_ptr<NetworkSliceInfo> requestAgain, std::shared_ptr<TrafficDescriptorsInfo> requestTd,
301 std::shared_ptr<TrafficDescriptorsInfo> tdsInUrsp)
302 {
303 NETMGR_EXT_LOG_I("HandleRsdRequestAgain");
304 if (requestAgain == nullptr || requestTd == nullptr) {
305 return nullptr;
306 }
307 std::shared_ptr<SliceRouteInfo> sri;
308 if (tdsInUrsp != nullptr) {
309 sri = requestAgain->getSliceRouteInfo(*tdsInUrsp);
310 }
311 if (sri == nullptr) {
312 // sri is null means the tdsInUrsp is first bind to process.
313 return HandleMultipleUrspFirstBind(requestAgain, tdsInUrsp, requestTd);
314 }
315 // IP bind do not need to bind again
316 bool isBinded = requestAgain->isBindCompleted(requestTd->getUid(), requestTd->getFqdnIps(), tdsInUrsp);
317 if (tdsInUrsp->isIpTriad() || isBinded) {
318 // unbindAllProccessToNetwork will clear usedUid, and when app appears foreground we should cache it again
319 if (tdsInUrsp->isUidRouteBindType() && sri != nullptr) {
320 sri->addUsedUid(requestTd->getUid());
321 }
322 NETMGR_EXT_LOG_I("networkSlice has allready binded uid: %{public}d", requestTd->getUid());
323 if (requestTd->isNeedToCreateRequest()) {
324 requestTd->setRequestAgain(true);
325 return requestAgain;
326 }
327 return nullptr;
328 }
329 if (requestAgain->getNetId() == NetworkSliceInfo::INVALID_NET_ID) {
330 // RSD not null but NetId is invalid, that means the slice network is activing.
331 return HandleInvalidNetwork(requestAgain, tdsInUrsp, requestTd);
332 }
333 int bindResult = BindNetworkSliceProcessToNetworkForRequestAgain(requestTd->getUid(), requestAgain,
334 std::make_shared<FqdnIps>(requestTd->getFqdnIps()), tdsInUrsp);
335 if (bindResult == BINDNETWORKSLICESUCCESS && tdsInUrsp->isUidRouteBindType()) {
336 requestAgain->addUid(requestTd->getUid(), *tdsInUrsp);
337 requestAgain->addUsedUid(requestTd->getUid(), *tdsInUrsp);
338 TryAddSignedUid(requestTd->getUid(), *tdsInUrsp, requestAgain);
339 }
340 NETMGR_EXT_LOG_I("no need to request this slice again. uid = %{public}d and bind result %{public}d",
341 requestTd->getUid(), bindResult);
342 if (requestTd->isNeedToCreateRequest()) {
343 requestTd->setRequestAgain(true);
344 return requestAgain;
345 }
346 return nullptr;
347 }
348
isUpToToplimit()349 bool HwNetworkSliceManager::isUpToToplimit()
350 {
351 return mNetworkSliceCounter.load() >= MAX_NETWORK_SLICE;
352 }
353
GetNetworkSliceInfoByParaRsd(RouteSelectionDescriptorInfo & rsd,NetworkSliceInfo::ParaType type)354 std::shared_ptr<NetworkSliceInfo> HwNetworkSliceManager::GetNetworkSliceInfoByParaRsd(
355 RouteSelectionDescriptorInfo& rsd, NetworkSliceInfo::ParaType type)
356 {
357 int i = 0;
358 for (auto sliceInfo : mNetworkSliceInfos) {
359 NETMGR_EXT_LOG_I("GetNetworkSliceInfoByParaRsd i = %{public}d", i);
360 ++i;
361 if (sliceInfo->isRightNetworkSliceRsd(rsd, type)) {
362 NETMGR_EXT_LOG_I("getNetworkSliceInfoByPara, sliceInfo");
363 return sliceInfo;
364 }
365 }
366 NETMGR_EXT_LOG_I("getNetworkSliceInfoByPara, return null");
367 return std::shared_ptr<NetworkSliceInfo>();
368 }
369
GetNetworkSliceInfoByParaNull(NetworkSliceInfo::ParaType type)370 std::shared_ptr<NetworkSliceInfo> HwNetworkSliceManager::GetNetworkSliceInfoByParaNull(NetworkSliceInfo::ParaType type)
371 {
372 NETMGR_EXT_LOG_I("GetNetworkSliceInfoByParaNull");
373 int i = 0;
374 for (auto sliceInfo : mNetworkSliceInfos) {
375 NETMGR_EXT_LOG_I("GetNetworkSliceInfoByParaNull i = %{public}d", i);
376 ++i;
377 if (sliceInfo->isRightNetworkSliceNull(type)) {
378 NETMGR_EXT_LOG_I("getNetworkSliceInfoByNull, sliceInfo");
379 return sliceInfo;
380 }
381 }
382 NETMGR_EXT_LOG_I("getNetworkSliceInfoByNull, return null");
383 return std::shared_ptr<NetworkSliceInfo>();
384 }
385
GetNetworkSliceInfoByParaNetCap(NetCap netCap)386 std::shared_ptr<NetworkSliceInfo> HwNetworkSliceManager::GetNetworkSliceInfoByParaNetCap(NetCap netCap)
387 {
388 NETMGR_EXT_LOG_I("GetNetworkSliceInfoByParaNetCap = %{public}d", netCap);
389 for (auto sliceInfo : mNetworkSliceInfos) {
390 if (sliceInfo->isRightNetworkSliceNetCap(netCap)) {
391 NETMGR_EXT_LOG_I("getNetworkSliceInfoByNetCap, sliceInfo");
392 return sliceInfo;
393 }
394 }
395 NETMGR_EXT_LOG_I("getNetworkSliceInfoByNetCap, return null");
396 return std::shared_ptr<NetworkSliceInfo>();
397 }
398
HandleMultipleUrspFirstBind(std::shared_ptr<NetworkSliceInfo> requestAgain,std::shared_ptr<TrafficDescriptorsInfo> requestTd,std::shared_ptr<TrafficDescriptorsInfo> tdsInUrsp)399 std::shared_ptr<NetworkSliceInfo> HwNetworkSliceManager::HandleMultipleUrspFirstBind(
400 std::shared_ptr<NetworkSliceInfo> requestAgain, std::shared_ptr<TrafficDescriptorsInfo> requestTd,
401 std::shared_ptr<TrafficDescriptorsInfo> tdsInUrsp)
402 {
403 NETMGR_EXT_LOG_I("HandleMultipleUrspFirstBind");
404 if (requestAgain == nullptr || requestTd == nullptr || tdsInUrsp == nullptr) {
405 return nullptr;
406 }
407 requestAgain->cacheTrafficDescriptors(*tdsInUrsp);
408 std::set<int> triggerActivationUids;
409 triggerActivationUids.insert(requestTd->getUid());
410 TryAddSignedUid(requestTd->getUid(), *tdsInUrsp, requestAgain);
411
412 if (tdsInUrsp->isMatchFqdn()) {
413 requestAgain->setFqdnIps(requestTd->getFqdnIps(), *tdsInUrsp);
414 }
415 BindNetworkSliceProcessToNetwork(requestTd->getUid(), triggerActivationUids, requestAgain,
416 requestAgain->getFqdnIps(*tdsInUrsp), tdsInUrsp);
417 if (requestTd->isNeedToCreateRequest()) {
418 requestTd->setRequestAgain(true);
419 return requestAgain;
420 }
421 NETMGR_EXT_LOG_I("HandleMultipleUrspFirstBind End");
422 return nullptr;
423 }
424
HandleInvalidNetwork(std::shared_ptr<NetworkSliceInfo> requestAgain,std::shared_ptr<TrafficDescriptorsInfo> tdsInUrsp,std::shared_ptr<TrafficDescriptorsInfo> requestTd)425 std::shared_ptr<NetworkSliceInfo> HwNetworkSliceManager::HandleInvalidNetwork(
426 std::shared_ptr<NetworkSliceInfo> requestAgain, std::shared_ptr<TrafficDescriptorsInfo> tdsInUrsp,
427 std::shared_ptr<TrafficDescriptorsInfo> requestTd)
428 {
429 NETMGR_EXT_LOG_I("HandleInvalidNetwork");
430 if (requestAgain == nullptr || tdsInUrsp == nullptr || requestTd == nullptr) {
431 return nullptr;
432 }
433 std::vector<FqdnIps> waittingFqdnIps = requestAgain->getWaittingFqdnIps(*tdsInUrsp);
434 if (waittingFqdnIps.size() == 0) {
435 waittingFqdnIps = std::vector<FqdnIps>();
436 requestAgain->setWaittingFqdnIps(waittingFqdnIps, *tdsInUrsp);
437 }
438 if (requestAgain->getFqdnIps(*tdsInUrsp) != nullptr) {
439 waittingFqdnIps.push_back(requestAgain->getFqdnIps(*tdsInUrsp)->getNewFqdnIps(requestTd->getFqdnIps()));
440 }
441
442 if (requestTd->isNeedToCreateRequest()) {
443 requestTd->setRequestAgain(true);
444 return requestAgain;
445 }
446 return nullptr;
447 }
448
TryAddSignedUid(int uid,TrafficDescriptorsInfo tds,std::shared_ptr<NetworkSliceInfo> nsi)449 void HwNetworkSliceManager::TryAddSignedUid(int uid, TrafficDescriptorsInfo tds, std::shared_ptr<NetworkSliceInfo> nsi)
450 {
451 NETMGR_EXT_LOG_I("TryAddSignedUid");
452 std::shared_ptr<TrafficDescriptorsInfo> tds_ptr = std::make_shared<TrafficDescriptorsInfo>(tds);
453 if (tds_ptr == nullptr || nsi == nullptr) {
454 return;
455 }
456 std::string packageName;
457 int ret = DelayedSingleton<NetworkSliceService>::GetInstance()->GetBundleNameForUid(uid, packageName);
458 if (ret != NETMANAGER_EXT_SUCCESS) {
459 NETMGR_EXT_LOG_E("Error GetBundleNameForUid fail");
460 return;
461 }
462 if (!tds_ptr->isAtiveTriggeringApp(packageName)) {
463 return;
464 }
465 nsi->addSignedUid(uid, tds);
466 }
467
FillBindParas(int netId,int urspPrecedence,std::map<std::string,std::string> & bindParas)468 static void FillBindParas(int netId, int urspPrecedence, std::map<std::string, std::string>& bindParas)
469 {
470 bindParas[BIND_ROUTE_NETID] = std::to_string(netId);
471 bindParas[BIND_ROUTE_URSP_PRECEDENCE] = std::to_string(urspPrecedence);
472 }
473
FillBindParas(const std::set<int> & uids,std::map<std::string,std::string> & bindParas)474 static void FillBindParas(const std::set<int>& uids, std::map<std::string, std::string>& bindParas)
475 {
476 NETMGR_EXT_LOG_E("FillBindParas");
477 if (uids.empty() || bindParas.empty()) {
478 return;
479 }
480 std::string uidsStr;
481 for (const auto& uid : uids) {
482 uidsStr += std::to_string(uid);
483 uidsStr += TrafficDescriptorsInfo::SEPARATOR;
484 }
485 NETMGR_EXT_LOG_E("FillBindParas uidsStr = %{public}s", uidsStr.c_str());
486 bindParas[BIND_ROUTE_UID] = uidsStr;
487 }
488
BindNetworkSliceProcessToNetwork(int uid,const std::set<int> & triggerActivationUids,std::shared_ptr<NetworkSliceInfo> nsi,std::shared_ptr<FqdnIps> fqdnIps,std::shared_ptr<TrafficDescriptorsInfo> tds)489 int HwNetworkSliceManager::BindNetworkSliceProcessToNetwork(int uid, const std::set<int>& triggerActivationUids,
490 std::shared_ptr<NetworkSliceInfo> nsi, std::shared_ptr<FqdnIps> fqdnIps,
491 std::shared_ptr<TrafficDescriptorsInfo> tds)
492 {
493 NETMGR_EXT_LOG_I("bindNetworkSliceProcessToNetwork Begin");
494 if (nsi == nullptr || nsi->getNetId() == NetworkSliceInfo::INVALID_NET_ID || tds == nullptr) {
495 return ERROR_INVALID_PARAM;
496 }
497 std::map<std::string, std::string> bindParas;
498 FillBindParas(nsi->getNetId(), tds->getUrspPrecedence(), bindParas);
499 NETMGR_EXT_LOG_I("bindNetworkSliceProcessToNetwork NetId = %{public}d, Uid = %{public}d, Precedence = %{public}d",
500 nsi->getNetId(), uid, tds->getUrspPrecedence());
501 NETMGR_EXT_LOG_I("bindNetworkSliceProcessToNetwork appid = %{public}s", tds->getAppIds().c_str());
502 switch (tds->getRouteBindType()) {
503 case TrafficDescriptorsInfo::UID_TDS:
504 FillUidBindParas(bindParas, tds, triggerActivationUids, nsi, uid);
505 break;
506 case TrafficDescriptorsInfo::IP_TDS:
507 NETMGR_EXT_LOG_E("TrafficDescriptorsInfo::IP_TDS");
508 FillIpBindParas(bindParas, tds, fqdnIps, nsi);
509 break;
510 case TrafficDescriptorsInfo::UID_IP_TDS:
511 NETMGR_EXT_LOG_E("TrafficDescriptorsInfo::IP_TDS");
512 FillUidBindParas(bindParas, tds, triggerActivationUids, nsi, uid);
513 FillIpBindParas(bindParas, tds, fqdnIps, nsi);
514 break;
515 case TrafficDescriptorsInfo::INVALID_TDS:
516 default:
517 NETMGR_EXT_LOG_E("Can not bind invalid tds");
518 break;
519 }
520 NETMGR_EXT_LOG_I("bindNetworkSliceProcessToNetwork End");
521 return BindProcessToNetwork(bindParas);
522 }
523
BindNetworkSliceProcessToNetworkForRequestAgain(int uid,std::shared_ptr<NetworkSliceInfo> nsi,std::shared_ptr<FqdnIps> fqdnIps,std::shared_ptr<TrafficDescriptorsInfo> tds)524 int HwNetworkSliceManager::BindNetworkSliceProcessToNetworkForRequestAgain(int uid,
525 std::shared_ptr<NetworkSliceInfo> nsi, std::shared_ptr<FqdnIps> fqdnIps,
526 std::shared_ptr<TrafficDescriptorsInfo> tds)
527 {
528 NETMGR_EXT_LOG_I("bindNetworkSliceProcessToNetworkForRequestAgain");
529 if (nsi == nullptr || nsi->getNetId() == NetworkSliceInfo::INVALID_NET_ID || tds == nullptr) {
530 return ERROR_INVALID_PARAM;
531 }
532 if (nsi->isMatchAll()) {
533 return BINDNETWORKSLICESUCCESS;
534 }
535 std::map<std::string, std::string> bindParas;
536 FillBindParas(nsi->getNetId(), tds->getUrspPrecedence(), bindParas);
537
538 switch (tds->getRouteBindType()) {
539 case TrafficDescriptorsInfo::UID_TDS:
540 FillUidBindParasForRequestAgain(bindParas, uid, nsi, tds);
541 break;
542 case TrafficDescriptorsInfo::IP_TDS:
543 FillIpBindParas(bindParas, tds, fqdnIps, nsi);
544 break;
545 case TrafficDescriptorsInfo::UID_IP_TDS:
546 FillUidBindParasForRequestAgain(bindParas, uid, nsi, tds);
547 FillIpBindParas(bindParas, tds, fqdnIps, nsi);
548 break;
549 default:
550 NETMGR_EXT_LOG_E("Can not bind invalid tds");
551 break;
552 }
553 return BindProcessToNetwork(bindParas);
554 }
555
FillUidBindParasForRequestAgain(std::map<std::string,std::string> & bindParas,int uid,std::shared_ptr<NetworkSliceInfo> nsi,std::shared_ptr<TrafficDescriptorsInfo> tds)556 void HwNetworkSliceManager::FillUidBindParasForRequestAgain(std::map<std::string, std::string>& bindParas, int uid,
557 std::shared_ptr<NetworkSliceInfo> nsi, std::shared_ptr<TrafficDescriptorsInfo> tds)
558 {
559 std::set<int> triggerActivationUids;
560 triggerActivationUids.insert(uid);
561 FillBindParas(triggerActivationUids, bindParas);
562 nsi->addUid(uid, *tds);
563 nsi->addUsedUid(uid, *tds);
564 }
565
FillUidBindParas(std::map<std::string,std::string> & bindParas,std::shared_ptr<TrafficDescriptorsInfo> tds,const std::set<int> & triggerActivationUids,std::shared_ptr<NetworkSliceInfo> nsi,int uid)566 void HwNetworkSliceManager::FillUidBindParas(std::map<std::string, std::string>& bindParas,
567 std::shared_ptr<TrafficDescriptorsInfo> tds, const std::set<int>& triggerActivationUids,
568 std::shared_ptr<NetworkSliceInfo> nsi, int uid)
569 {
570 NETMGR_EXT_LOG_E("FillUidBindParas");
571 if (tds->isMatchNetworkCap()) {
572 NETMGR_EXT_LOG_E("FillUidBindParas isMatchNetworkCap");
573 FillBindParas(triggerActivationUids, bindParas);
574 nsi->addUids(triggerActivationUids, *tds);
575 } else {
576 std::set<int> allUids;
577 std::set<int> autoUids = GetAutoUids(tds);
578 allUids.insert(autoUids.begin(), autoUids.end());
579 allUids.insert(nsi->getSignedUids(*tds).begin(), nsi->getSignedUids(*tds).end());
580 NETMGR_EXT_LOG_E("FillUidBindParas autoUids.size = %{public}d, allUids.size = %{public}d",
581 (int)autoUids.size(), (int)allUids.size());
582 FillBindParas(allUids, bindParas);
583 nsi->replaceUids(*tds, autoUids);
584 }
585
586 if (tds->isMatchNetworkCap()) {
587 nsi->addUsedUids(triggerActivationUids, *tds);
588 } else {
589 if (uid != INVALID_UID) {
590 nsi->addUsedUid(uid, *tds);
591 }
592 }
593 }
594
FillIpBindParas(std::map<std::string,std::string> & bindParas,std::shared_ptr<TrafficDescriptorsInfo> tds,std::shared_ptr<FqdnIps> fqdnIps,std::shared_ptr<NetworkSliceInfo> nsi)595 void HwNetworkSliceManager::FillIpBindParas(std::map<std::string, std::string>& bindParas,
596 std::shared_ptr<TrafficDescriptorsInfo> tds, std::shared_ptr<FqdnIps> fqdnIps,
597 std::shared_ptr<NetworkSliceInfo> nsi)
598 {
599 NETMGR_EXT_LOG_E("FillIpBindParas");
600 if (tds->isMatchFqdn()) {
601 if (fqdnIps == nullptr) {
602 return;
603 }
604 FqdnIps newFqdnIps = *fqdnIps;
605 std::shared_ptr<FqdnIps> nsiFqdnIps = nsi->getFqdnIps(*tds);
606 if (nsiFqdnIps == nullptr) {
607 nsi->setFqdnIps(newFqdnIps, *tds);
608 } else {
609 newFqdnIps = nsiFqdnIps->getNewFqdnIps(*fqdnIps);
610 nsi->mergeFqdnIps(*fqdnIps, *tds);
611 }
612 FillIpBindParasForFqdn(bindParas, newFqdnIps);
613 } else {
614 FillIpBindParasForIpTriad(bindParas, tds);
615 }
616 }
617
FillNetworkSliceRequest(std::shared_ptr<TrafficDescriptorsInfo> td)618 std::map<std::string, std::string> HwNetworkSliceManager::FillNetworkSliceRequest(
619 std::shared_ptr<TrafficDescriptorsInfo> td)
620 {
621 NETMGR_EXT_LOG_I("FillNetworkSliceRequest");
622 std::string appId;
623 int ret = DelayedSingleton<NetworkSliceService>::GetInstance()->GetBundleNameForUid(td->getUid(), appId);
624 if (ret != NETMANAGER_EXT_SUCCESS) {
625 NETMGR_EXT_LOG_E("Error GetBundleNameForUid fail");
626 }
627 NETMGR_EXT_LOG_E("FillNetworkSliceRequest Uid = %{public}d, appId = %{public}s", td->getUid(), appId.c_str());
628 appId = REQUEST_NETWORK_SLICE_OS_ID + appId;
629 std::string ip = td->getIp().address_;
630 std::map<std::string, std::string> bundle;
631
632 if (!appId.empty()) {
633 bundle[REQUEST_NETWORK_SLICE_APPID] = appId;
634 NETMGR_EXT_LOG_I("bundle appId = %{public}s", bundle[REQUEST_NETWORK_SLICE_APPID].c_str());
635 }
636 if (!td->getDnn().empty()) {
637 bundle[REQUEST_NETWORK_SLICE_DNN] = td->getDnn();
638 NETMGR_EXT_LOG_I("bundle DNN = %{public}s", bundle[REQUEST_NETWORK_SLICE_DNN].c_str());
639 }
640 if (!td->getFqdn().empty()) {
641 bundle[REQUEST_NETWORK_SLICE_FQDN] = td->getFqdn();
642 NETMGR_EXT_LOG_I("bundle FQDN = %{public}s", bundle[REQUEST_NETWORK_SLICE_FQDN].c_str());
643 }
644 if (!ip.empty()) {
645 bundle[REQUEST_NETWORK_SLICE_IP] = ip;
646 NETMGR_EXT_LOG_I("bundle IP = %{public}s", bundle[REQUEST_NETWORK_SLICE_IP].c_str());
647 }
648 if (!td->getProtocolId().empty()) {
649 bundle[REQUEST_NETWORK_SLICE_PROTOCOL] = td->getProtocolId();
650 NETMGR_EXT_LOG_I("bundle PROTOCOL = %{public}s", bundle[REQUEST_NETWORK_SLICE_PROTOCOL].c_str());
651 }
652 if (!td->getRemotePort().empty()) {
653 bundle[REQUEST_NETWORK_SLICE_REMOTE_PORT] = td->getRemotePort();
654 NETMGR_EXT_LOG_I("bundle REMOTE_PORT = %{public}s", bundle[REQUEST_NETWORK_SLICE_REMOTE_PORT].c_str());
655 }
656 if (td->getCct() != 0) {
657 bundle[REQUEST_NETWORK_SLICE_CONNECTION_CAPABILITY] = std::to_string(td->getCct());
658 NETMGR_EXT_LOG_I("bundle CONNECTION_CAPABILITY = %{public}s",
659 bundle[REQUEST_NETWORK_SLICE_CONNECTION_CAPABILITY].c_str());
660 }
661 return bundle;
662 }
663
FillIpBindParasForFqdn(std::map<std::string,std::string> & bindParas,const FqdnIps & newFqdnIps)664 void HwNetworkSliceManager::FillIpBindParasForFqdn(
665 std::map<std::string, std::string>& bindParas, const FqdnIps& newFqdnIps)
666 {
667 if (!bindParas.empty() && !newFqdnIps.getIpv4AddrAndMask().empty() && !newFqdnIps.getIpv6AddrAndPrefix().empty()) {
668 bindParas[BIND_ROUTE_IPV4_NUM] = std::to_string(newFqdnIps.getIpv4Num());
669 bindParas[BIND_ROUTE_IPV4_ADDRANDMASK] = ConvertUint8vecToString(newFqdnIps.getIpv4AddrAndMask());
670 bindParas[BIND_ROUTE_IPV6_NUM] = std::to_string(newFqdnIps.getIpv6Num());
671 bindParas[BIND_ROUTE_IPV6_ADDRANDPREFIX] = ConvertUint8vecToString(newFqdnIps.getIpv6AddrAndPrefix());
672 bindParas[BIND_ROUTE_PROTOCOL_IDS] = "";
673 bindParas[BIND_ROUTE_REMOTE_PORTS] = "";
674 }
675 }
676
FillIpBindParasForIpTriad(std::map<std::string,std::string> & bindParas,std::shared_ptr<TrafficDescriptorsInfo> tds)677 void HwNetworkSliceManager::FillIpBindParasForIpTriad(std::map<std::string, std::string>& bindParas,
678 std::shared_ptr<TrafficDescriptorsInfo> tds)
679 {
680 if (!bindParas.empty() && tds != nullptr) {
681 bindParas[BIND_ROUTE_IPV4_NUM] = std::to_string(tds->getIpv4Num());
682 bindParas[BIND_ROUTE_IPV4_ADDRANDMASK] = ConvertUint8vecToString(tds->getIpv4AddrAndMask());
683 bindParas[BIND_ROUTE_IPV6_NUM] = std::to_string(tds->getIpv6Num());
684 bindParas[BIND_ROUTE_IPV6_ADDRANDPREFIX] = ConvertUint8vecToString(tds->getIpv6AddrAndPrefix());
685 bindParas[BIND_ROUTE_PROTOCOL_IDS] = tds->getProtocolIds();
686 bindParas[BIND_ROUTE_REMOTE_PORTS] = tds->getRemotePorts();
687 }
688 }
689
GetAutoUids(const std::shared_ptr<TrafficDescriptorsInfo> & tds)690 std::set<int> HwNetworkSliceManager::GetAutoUids(const std::shared_ptr<TrafficDescriptorsInfo>& tds)
691 {
692 if (tds == nullptr) {
693 return std::set<int>();
694 }
695 std::string uidsStr = GetUidsFromAppIds(tds->getAppIds());
696 if (uidsStr.empty()) {
697 NETMGR_EXT_LOG_E("GetAutoUids uidsStr.empty()");
698 return std::set<int>();
699 }
700 std::vector<std::string> uidStrs = Split(uidsStr, SEPARATOR_FOR_NORMAL_DATA);
701 if (uidStrs.empty()) {
702 NETMGR_EXT_LOG_E("GetAutoUids uidStrs.empty()");
703 return std::set<int>();
704 }
705 std::set<int> tempUids;
706 for (const auto& uidStr : uidStrs) {
707 if (!uidStr.empty()) {
708 tempUids.insert(std::stoi(uidStr));
709 }
710 }
711 NETMGR_EXT_LOG_E("bindNetworkSliceProcessToNetwork getUidsFromAppIds= %{public}s", uidsStr.c_str());
712 return tempUids;
713 }
714
GetUidsFromAppIds(const std::string & originAppIds)715 std::string HwNetworkSliceManager::GetUidsFromAppIds(const std::string& originAppIds)
716 {
717 NETMGR_EXT_LOG_I("GetUidsFromAppIds originAppIds = %{public}s", originAppIds.c_str());
718 std::set<std::string> appIds = GetAppIdsWithoutOsId(originAppIds);
719 if (appIds.empty()) {
720 NETMGR_EXT_LOG_E("GetUidsFromAppIds appIds.empty()");
721 return "";
722 }
723 NETMGR_EXT_LOG_I("GetUidsFromAppIds appIds.size() = %{public}d", (int)appIds.size());
724 std::string result = std::accumulate(appIds.begin(), appIds.end(), std::string{},
725 [this](const std::string& current, const std::string& element) {
726 return current +
727 std::to_string(DelayedSingleton<NetworkSliceService>::GetInstance()->GetUidByBundleName(element)) +
728 SEPARATOR_FOR_NORMAL_DATA;
729 });
730 NETMGR_EXT_LOG_I("getUidsFromAppIds, uids = %{public}s", result.c_str());
731 return result;
732 }
733
GetAppIdsWithoutOsId(const std::string & originAppIds)734 std::set<std::string> HwNetworkSliceManager::GetAppIdsWithoutOsId(const std::string& originAppIds)
735 {
736 NETMGR_EXT_LOG_I("GetAppIdsWithoutOsId");
737 std::vector<std::string> orgins = Split(originAppIds, SEPARATOR_FOR_NORMAL_DATA);
738 if (orgins.empty()) {
739 NETMGR_EXT_LOG_E("getAppIdsWithoutOsId orgins == null, should not run here.");
740 return std::set<std::string>();
741 }
742 std::set<std::string> appIds;
743 for (const auto& osIdAppId : orgins) {
744 NETMGR_EXT_LOG_I("GetAppIdsWithoutOsId osIdAppId = %{public}s", osIdAppId.c_str());
745 HwOsAppId osAppId = HwOsAppId::Create(osIdAppId);
746 NETMGR_EXT_LOG_I("GetAppIdsWithoutOsId Create OsId = %{public}s, AppId = %{public}s",
747 osAppId.getOsId().c_str(), osAppId.getAppId().c_str());
748 if (osAppId.getAppId() == "") {
749 continue;
750 }
751 appIds.insert(osAppId.getAppId());
752 }
753 return appIds;
754 }
755
RequestNetwork(int uid,std::shared_ptr<NetworkSliceInfo> networkSliceInfo)756 void HwNetworkSliceManager::RequestNetwork(int uid, std::shared_ptr<NetworkSliceInfo> networkSliceInfo)
757 {
758 if (uid == INVALID_UID) {
759 return;
760 }
761 if (networkSliceInfo == nullptr || networkSliceInfo->getNetworkRequest() == nullptr) {
762 NETMGR_EXT_LOG_E("networkSliceInfo is null with no request id");
763 return;
764 }
765 RequestNetwork(uid, networkSliceInfo, 0, REQUEST_NETWORK_TIMEOUT);
766 }
767
RequestNetwork(int uid,std::shared_ptr<NetworkSliceInfo> networkSliceInfo,int requestId,int timeoutMs)768 void HwNetworkSliceManager::RequestNetwork(int uid, std::shared_ptr<NetworkSliceInfo> networkSliceInfo,
769 int requestId, int timeoutMs)
770 {
771 NETMGR_EXT_LOG_I("HwNetworkSliceManager::RequestNetwork");
772 if (networkSliceInfo == nullptr) {
773 NETMGR_EXT_LOG_E("requestNetwork networkSliceInfo is null");
774 return;
775 }
776 std::shared_ptr<RouteSelectionDescriptorInfo> rsd = networkSliceInfo->getRouteSelectionDescriptor();
777 std::shared_ptr<TrafficDescriptorsInfo> tds = networkSliceInfo->getTempTrafficDescriptors();
778 if (rsd == nullptr || tds == nullptr) {
779 NETMGR_EXT_LOG_E("requestNetwork rsd is null or tds is null");
780 return;
781 }
782 sptr<NetSpecifier> request = networkSliceInfo->getNetworkRequest();
783 if (request == nullptr) {
784 // normally it can not run here.
785 NETMGR_EXT_LOG_E("Can not get request by capability:%{public}d", networkSliceInfo->getNetworkCapability());
786 CleanRouteSelectionDescriptor(networkSliceInfo);
787 return;
788 }
789 FillRsdIntoNetworkRequest(request, *rsd, *tds); // need check
790
791 sptr<NetConnCallback> callback = networkSliceInfo->getNetworkCallback();
792 if (callback == nullptr) {
793 callback = sptr<NetConnCallback>(new NetConnCallback());
794 }
795 if (callback == nullptr) {
796 return;
797 }
798 callback->SetNetCap(*request->netCapabilities_.netCaps_.begin());
799 callback->CacheRequestUid(uid);
800 callback->SetUid(uid);
801 int32_t ret = NetConnClient::GetInstance().RequestNetConnection(request, callback, timeoutMs);
802 networkSliceInfo->setNetworkCallback(callback);
803 }
804
FillRsdIntoNetworkRequest(const sptr<NetSpecifier> request,const RouteSelectionDescriptorInfo & rsd,const TrafficDescriptorsInfo & tds)805 void HwNetworkSliceManager::FillRsdIntoNetworkRequest(const sptr<NetSpecifier> request,
806 const RouteSelectionDescriptorInfo& rsd, const TrafficDescriptorsInfo& tds)
807 {
808 NETMGR_EXT_LOG_I("FillRsdIntoNetworkRequest");
809 std::map<std::string, std::string> bundle;
810 bundle["dnn"] = rsd.getDnn();
811 bundle["snssai"] = rsd.getSnssai();
812 bundle["sscmode"] = std::to_string(rsd.getSscMode());
813 bundle["pdusessiontype"] = std::to_string(rsd.getPduSessionType());
814 bundle["routebitmap"] = std::to_string(tds.getRouteBitmap());
815 NETMGR_EXT_LOG_I("FillRsdIntoNetworkRequest sscMode = %{public}d", rsd.getSscMode());
816 NETMGR_EXT_LOG_I("FillRsdIntoNetworkRequest dnn = %{public}s", rsd.getDnn().c_str());
817 NETMGR_EXT_LOG_I("FillRsdIntoNetworkRequest snssai = %{public}s", rsd.getSnssai().c_str());
818 NETMGR_EXT_LOG_I("FillRsdIntoNetworkRequest pdusession = %{public}d", rsd.getPduSessionType());
819 NETMGR_EXT_LOG_I("FillRsdIntoNetworkRequest routebitmap = %{public}d", tds.getRouteBitmap());
820 networkSliceParas[*request->netCapabilities_.netCaps_.begin()] = bundle;
821 }
822
GetRSDByNetCap(int32_t netcap,std::map<std::string,std::string> & sliceParasbyNetcap)823 void HwNetworkSliceManager::GetRSDByNetCap(int32_t netcap, std::map<std::string, std::string>& sliceParasbyNetcap)
824 {
825 NETMGR_EXT_LOG_I("GetRSDByNetCap");
826 auto it = networkSliceParas.find(netcap);
827 if (it != networkSliceParas.end()) {
828 sliceParasbyNetcap = it->second;
829 }
830 }
831
ChangeNetworkSliceCounter(int changeType)832 void HwNetworkSliceManager::ChangeNetworkSliceCounter(int changeType)
833 {
834 switch (changeType) {
835 case CHANGE_TYPE_INCREASE:
836 mNetworkSliceCounter.fetch_add(1, std::memory_order_relaxed);
837 break;
838 case CHANGE_TYPE_DECREASE:
839 mNetworkSliceCounter.fetch_sub(1, std::memory_order_relaxed);
840 break;
841 case CHANGE_TYPE_ZEROING:
842 mNetworkSliceCounter.store(0, std::memory_order_relaxed);
843 break;
844 default:
845 NETMGR_EXT_LOG_I("wrong type of network slice counter: %{public}d", changeType);
846 break;
847 }
848 }
849
isCanRequestNetwork()850 bool HwNetworkSliceManager::isCanRequestNetwork()
851 {
852 return DelayedSingleton<NetworkSliceManager>::GetInstance()->isCanRequestNetwork();
853 }
854
isCanMatchNetworkSlices()855 bool HwNetworkSliceManager::isCanMatchNetworkSlices()
856 {
857 if (!isEnvironmentReady()) {
858 return false;
859 }
860 if (!isCanRequestNetwork()) {
861 return false;
862 }
863 return true;
864 }
865
isEnvironmentReady()866 bool HwNetworkSliceManager::isEnvironmentReady()
867 {
868 if (!g_isNrSliceSupport) {
869 return false;
870 }
871 if (!mIsReady) {
872 return false;
873 }
874 if (!isUrspAvailable()) {
875 return false;
876 }
877 return true;
878 }
879
isUrspAvailable()880 bool HwNetworkSliceManager::isUrspAvailable()
881 {
882 return mIsUrspAvailable;
883 }
884
SetUrspAvailable(bool urspAvailable)885 void HwNetworkSliceManager::SetUrspAvailable(bool urspAvailable)
886 {
887 mIsUrspAvailable = urspAvailable;
888 }
889
isNeedToRequestSliceForAppIdAuto(std::string appId)890 bool HwNetworkSliceManager::isNeedToRequestSliceForAppIdAuto(std::string appId)
891 {
892 if (isCooperativeApp(appId)) {
893 return false;
894 }
895 HwOsAppId id = HwOsAppId::Create(REQUEST_NETWORK_SLICE_OS_ID + appId);
896 return std::find(mWhiteListForOsAppId.begin(), mWhiteListForOsAppId.end(), id)
897 != mWhiteListForOsAppId.end();
898 }
899
isNeedToRequestSliceForFqdnAuto(std::string fqdn,int uid)900 bool HwNetworkSliceManager::isNeedToRequestSliceForFqdnAuto(std::string fqdn, int uid)
901 {
902 if (isCooperativeAppByUid(uid)) {
903 return false;
904 }
905 return std::find(mWhiteListForFqdn.begin(), mWhiteListForFqdn.end(), fqdn)
906 != mWhiteListForFqdn.end();
907 }
908
isNeedToRequestSliceForDnnAuto(std::string dnn,int uid)909 bool HwNetworkSliceManager::isNeedToRequestSliceForDnnAuto(std::string dnn, int uid)
910 {
911 if (isCooperativeAppByUid(uid)) {
912 return false;
913 }
914 return std::find(mWhiteListForDnn.begin(), mWhiteListForDnn.end(), dnn)
915 != mWhiteListForDnn.end();
916 }
917
isCooperativeAppByUid(int uid)918 bool HwNetworkSliceManager::isCooperativeAppByUid(int uid)
919 {
920 std::string packageName;
921 int ret = DelayedSingleton<NetworkSliceService>::GetInstance()->GetBundleNameForUid(uid, packageName);
922 if (ret != NETMANAGER_EXT_SUCCESS) {
923 NETMGR_EXT_LOG_E("Error GetBundleNameForUid fail");
924 return false;
925 }
926 return isCooperativeApp(packageName);
927 }
928
isCooperativeApp(std::string packageName)929 bool HwNetworkSliceManager::isCooperativeApp(std::string packageName)
930 {
931 return std::find(mWhiteListForCooperativeApp.begin(), mWhiteListForCooperativeApp.end(), packageName)
932 != mWhiteListForCooperativeApp.end();
933 }
934
ReadAppIdWhiteList(TrafficDescriptorWhiteList whiteList)935 void HwNetworkSliceManager::ReadAppIdWhiteList(TrafficDescriptorWhiteList whiteList)
936 {
937 std::string osAppIds = whiteList.osAppIds;
938 if (!osAppIds.empty()) {
939 mWhiteListForOsAppId.clear();
940 std::vector<std::string> values = Split(osAppIds, SEPARATOR_FOR_NORMAL_DATA);
941 if (values.size() != 0) {
942 for (size_t i = 0; i < values.size(); ++i) {
943 mWhiteListForOsAppId.push_back(HwOsAppId::Create(values[i]));
944 }
945 }
946 }
947 }
948
ReadDnnWhiteList(TrafficDescriptorWhiteList whiteList)949 void HwNetworkSliceManager::ReadDnnWhiteList(TrafficDescriptorWhiteList whiteList)
950 {
951 std::string dnns = whiteList.dnns;
952 if (!dnns.empty()) {
953 mWhiteListForDnn.clear();
954 std::vector<std::string> values = Split(dnns, SEPARATOR_FOR_NORMAL_DATA);
955 if (values.size() != 0) {
956 mWhiteListForDnn = values;
957 }
958 }
959 }
960
ReadFqdnWhiteList(TrafficDescriptorWhiteList whiteList)961 void HwNetworkSliceManager::ReadFqdnWhiteList(TrafficDescriptorWhiteList whiteList)
962 {
963 std::string fqdns = whiteList.fqdns;
964 if (!fqdns.empty()) {
965 std::vector<std::string> values = Split(fqdns, SEPARATOR_FOR_NORMAL_DATA);
966 if (values.size() != 0) {
967 mWhiteListForFqdn = values;
968 }
969 }
970 }
971
ReadCctWhiteList(TrafficDescriptorWhiteList whiteList)972 void HwNetworkSliceManager::ReadCctWhiteList(TrafficDescriptorWhiteList whiteList)
973 {
974 std::string ccts = whiteList.cct;
975 if (!ccts.empty()) {
976 std::vector<std::string> values = Split(ccts, SEPARATOR_FOR_NORMAL_DATA);
977 if (values.size() != 0) {
978 mWhiteListForCct = values;
979 }
980 }
981 }
982
UnbindAllProccessToNetwork()983 void HwNetworkSliceManager::UnbindAllProccessToNetwork()
984 {
985 for (auto nsi : mNetworkSliceInfos) {
986 if (nsi->isMatchAll()) {
987 continue;
988 }
989 if (nsi->getNetId() == NetworkSliceInfo::INVALID_NET_ID) {
990 continue;
991 }
992 auto entries = nsi->getSliceRouteInfos();
993 for (auto it = entries.begin(); it != entries.end(); ++it) {
994 const TrafficDescriptorsInfo& tds = it->first;
995 if (tds.isMatchNetworkCap()) {
996 continue;
997 }
998 std::shared_ptr<SliceRouteInfo> sri = nsi->getSliceRouteInfo(tds);
999 if (sri == nullptr) {
1000 continue;
1001 }
1002 UnbindUids(nsi->getNetId(), sri->getUidsStr(), tds.getUrspPrecedence());
1003 }
1004 }
1005 }
1006
CleanEnvironment()1007 void HwNetworkSliceManager::CleanEnvironment()
1008 {
1009 int result = UnbindAllRoute();
1010 NETMGR_EXT_LOG_I("unbind all route, result = %{public}d", result);
1011 for (auto nsi : mNetworkSliceInfos) {
1012 sptr<NetConnCallback> networkCallback = nsi->getNetworkCallback();
1013 if (networkCallback != nullptr) {
1014 NetConnClient::GetInstance().UnregisterNetConnCallback(networkCallback);
1015 OnNetworkLost(networkCallback->GetNetCap(), networkCallback->GetNetId());
1016 }
1017 nsi->clear();
1018 }
1019 mNetworkSliceInfos.clear();
1020 InitNetworkSliceInfos();
1021 networkSliceParas.clear();
1022 NETMGR_EXT_LOG_I("Clean Environment done");
1023 }
1024
UnbindAllRoute()1025 int HwNetworkSliceManager::UnbindAllRoute()
1026 {
1027 std::map<std::string, std::string> input;
1028 input[BIND_ROUTE_NETID] = std::to_string(UNBIND_TYPE_ALL);
1029 input[UNBIND_ROUTE_TYPE] = std::to_string(UNBIND_TYPE_ALL);
1030 int ret = DelayedSingleton<NetworkSliceService>::GetInstance()->DelBindToNetwork(input);
1031 if (ret != NETMANAGER_EXT_SUCCESS) {
1032 NETMGR_EXT_LOG_E("Error UnbindUids fail");
1033 }
1034 return ret;
1035 }
1036
UnbindSingleNetId(int netId)1037 int HwNetworkSliceManager::UnbindSingleNetId(int netId)
1038 {
1039 std::map<std::string, std::string> input;
1040 input[BIND_ROUTE_NETID] = std::to_string(netId);
1041 input[UNBIND_ROUTE_TYPE] = std::to_string(UNBIND_TYPE_NETID);
1042 int ret = DelayedSingleton<NetworkSliceService>::GetInstance()->DelBindToNetwork(input);
1043 if (ret != NETMANAGER_EXT_SUCCESS) {
1044 NETMGR_EXT_LOG_E("Error UnbindUids fail");
1045 }
1046 return ret;
1047 }
1048
UnbindUids(uint netId,const std::string & uids,uint8_t urspPrecedence)1049 int HwNetworkSliceManager::UnbindUids(uint netId, const std::string& uids, uint8_t urspPrecedence)
1050 {
1051 std::map<std::string, std::string> input;
1052 input[BIND_ROUTE_NETID] = std::to_string(netId);
1053 input[BIND_ROUTE_UID] = uids;
1054 input[BIND_ROUTE_URSP_PRECEDENCE] = std::to_string(static_cast<int>(urspPrecedence));
1055 input[UNBIND_ROUTE_TYPE] = std::to_string(UNBIND_TYPE_UIDS);
1056 int ret = DelayedSingleton<NetworkSliceService>::GetInstance()->DelBindToNetwork(input);
1057 if (ret != NETMANAGER_EXT_SUCCESS) {
1058 NETMGR_EXT_LOG_E("Error UnbindUids fail");
1059 }
1060 return ret;
1061 }
1062
BindProcessToNetwork(std::map<std::string,std::string> bindParas)1063 int HwNetworkSliceManager::BindProcessToNetwork(std::map<std::string, std::string> bindParas)
1064 {
1065 NETMGR_EXT_LOG_I("BindProcessToNetwork");
1066 int ret = DelayedSingleton<NetworkSliceService>::GetInstance()->BindToNetwork(bindParas);
1067 if (ret != NETMANAGER_EXT_SUCCESS) {
1068 NETMGR_EXT_LOG_E("Error UnbindUids fail");
1069 }
1070 return ret;
1071 }
1072
UnbindProcessToNetwork(std::string uids,int netId)1073 int HwNetworkSliceManager::UnbindProcessToNetwork(std::string uids, int netId)
1074 {
1075 std::map<std::string, std::string> input;
1076 input[BIND_ROUTE_NETID] = std::to_string(netId);
1077 input[BIND_ROUTE_UID] = uids;
1078 int ret = DelayedSingleton<NetworkSliceService>::GetInstance()->DelBindToNetwork(input);
1079 if (ret != NETMANAGER_EXT_SUCCESS) {
1080 NETMGR_EXT_LOG_E("Error UnbindUids fail");
1081 }
1082 return ret;
1083 }
1084
1085
RestoreSliceEnvironment()1086 void HwNetworkSliceManager::RestoreSliceEnvironment()
1087 {
1088 RequestMatchAllSlice();
1089 TryToActivateSliceForForegroundApp();
1090 }
1091
RequestMatchAllSlice()1092 void HwNetworkSliceManager::RequestMatchAllSlice()
1093 {
1094 if (!mHasMatchAllSlice == true || mIsMatchAllRequsted == true || mIsMatchRequesting == true) {
1095 return;
1096 }
1097
1098 if (!isCanRequestNetwork()) {
1099 return;
1100 }
1101 mIsMatchRequesting = true;
1102 for (std::shared_ptr<NetworkSliceInfo> nsi : mNetworkSliceInfos) {
1103 if (nsi->isMatchAll()) {
1104 RequestNetwork(INVALID_UID, nsi);
1105 break;
1106 }
1107 }
1108 }
1109
OnNetworkAvailable(NetCap netCap,int32_t netId)1110 void HwNetworkSliceManager::OnNetworkAvailable(NetCap netCap, int32_t netId)
1111 {
1112 NETMGR_EXT_LOG_I("HwNetworkSliceManager:OnNetworkAvailable");
1113 std::shared_ptr<NetworkSliceInfo> networkSliceInfo = GetNetworkSliceInfoByParaNetCap(netCap);
1114 if (networkSliceInfo == nullptr) {
1115 return;
1116 }
1117 networkSliceInfo->setNetId(netId);
1118 if (networkSliceInfo->isMatchAll()) {
1119 NETMGR_EXT_LOG_E("match_all do not need to bind route");
1120 mIsMatchAllRequsted.store(true, std::memory_order_relaxed);
1121 mIsMatchRequesting = false;
1122 return;
1123 }
1124 if (networkSliceInfo->getNetworkCallback() == nullptr) {
1125 NETMGR_EXT_LOG_E("getNetworkCallback() == nullptr");
1126 return;
1127 }
1128 int32_t uid = networkSliceInfo->getNetworkCallback()->GetUid();
1129 std::set<int32_t> triggerActivationUids = networkSliceInfo->getNetworkCallback()->GetRequestUids();
1130 for (TrafficDescriptorsInfo td : networkSliceInfo->getTrafficDescriptorsInfos()) {
1131 std::shared_ptr<TrafficDescriptorsInfo> tds = std::make_shared<TrafficDescriptorsInfo>(td);
1132 BindNetworkSliceProcessToNetwork(uid,
1133 triggerActivationUids,
1134 networkSliceInfo,
1135 networkSliceInfo->getFqdnIps(td),
1136 tds);
1137
1138 std::shared_ptr<SliceRouteInfo> sri = networkSliceInfo->getSliceRouteInfo(td);
1139 if (sri == nullptr) {
1140 continue;
1141 }
1142 for (FqdnIps fqdnIp : sri->getWaittingFqdnIps()) {
1143 std::shared_ptr<FqdnIps> fqdnIps = std::make_shared<FqdnIps>(fqdnIp);
1144 BindNetworkSliceProcessToNetwork(uid, triggerActivationUids, networkSliceInfo, fqdnIps, tds);
1145 }
1146
1147 // clear WaittingFqdnIps, because it only used in activating slice network
1148 networkSliceInfo->clearWaittingFqdnIps(td);
1149 NETMGR_EXT_LOG_I("bind success networkSliceInfo");
1150 }
1151 }
1152
OnNetworkLost(NetCap netCap,int32_t netId)1153 void HwNetworkSliceManager::OnNetworkLost(NetCap netCap, int32_t netId)
1154 {
1155 NETMGR_EXT_LOG_I("HwNetworkSliceManager:OnNetworkLost");
1156 std::shared_ptr<NetworkSliceInfo> networkSliceInfo = GetNetworkSliceInfoByParaNetCap(netCap);
1157 if (networkSliceInfo == nullptr) {
1158 NETMGR_EXT_LOG_I("OnNetworkLost networkSliceInfo == nullptr");
1159 return;
1160 }
1161 if (networkSliceInfo->isMatchAll()) {
1162 NETMGR_EXT_LOG_E("match_all do not need to bind route");
1163 mIsMatchAllRequsted.store(false, std::memory_order_relaxed);
1164 mIsMatchRequesting = false;
1165 return;
1166 }
1167
1168 networkSliceInfo->clearUsedUids();
1169 int result = UnbindSingleNetId(networkSliceInfo->getNetId());
1170 NETMGR_EXT_LOG_I("unbind uid to network slice result = %{public}d", result);
1171 }
1172
OnNetworkUnavailable(NetCap netCap)1173 void HwNetworkSliceManager::OnNetworkUnavailable(NetCap netCap)
1174 {
1175 NETMGR_EXT_LOG_I("HwNetworkSliceManager:OnNetworkUnavailable");
1176 std::shared_ptr<NetworkSliceInfo> networkSliceInfo = GetNetworkSliceInfoByParaNetCap(netCap);
1177 if (networkSliceInfo == nullptr) {
1178 return;
1179 }
1180 if (networkSliceInfo->isMatchAll()) {
1181 NETMGR_EXT_LOG_E("match_all do not need to bind route");
1182 mIsMatchAllRequsted.store(false, std::memory_order_relaxed);
1183 mIsMatchRequesting = false;
1184 return;
1185 }
1186 RecoveryNetworkSlice(networkSliceInfo);
1187 }
1188
RecoveryNetworkSlice(std::shared_ptr<NetworkSliceInfo> networkSliceInfo)1189 void HwNetworkSliceManager::RecoveryNetworkSlice(std::shared_ptr<NetworkSliceInfo> networkSliceInfo)
1190 {
1191 if (networkSliceInfo == nullptr) {
1192 return;
1193 }
1194 UnbindSingleNetId(networkSliceInfo->getNetId());
1195 sptr<NetConnCallback> networkCallback = networkSliceInfo->getNetworkCallback();
1196 NetConnClient::GetInstance().UnregisterNetConnCallback(networkCallback);
1197 networkSliceInfo->setNetId(NetworkSliceInfo::INVALID_NET_ID);
1198 networkSliceInfo->clearUids();
1199 networkSliceInfo->clearUsedUids();
1200 networkSliceInfo->clear();
1201
1202 ChangeNetworkSliceCounter(CHANGE_TYPE_DECREASE);
1203 }
1204
ReleaseNetworkSlice(std::shared_ptr<NetworkSliceInfo> networkSliceInfo)1205 void HwNetworkSliceManager::ReleaseNetworkSlice(std::shared_ptr<NetworkSliceInfo> networkSliceInfo)
1206 {
1207 if (networkSliceInfo == nullptr) {
1208 return;
1209 }
1210 UnbindSingleNetId(networkSliceInfo->getNetId());
1211 sptr<NetConnCallback> networkCallback = networkSliceInfo->getNetworkCallback();
1212 if (networkCallback != nullptr) {
1213 NetConnClient::GetInstance().UnregisterNetConnCallback(networkCallback);
1214 OnNetworkLost(networkCallback->GetNetCap(), networkCallback->GetNetId());
1215 }
1216 networkSliceInfo->clear();
1217 CleanRouteSelectionDescriptor(networkSliceInfo);
1218 }
1219
CleanRouteSelectionDescriptor(std::shared_ptr<NetworkSliceInfo> networkSliceInfo)1220 void HwNetworkSliceManager::CleanRouteSelectionDescriptor(std::shared_ptr<NetworkSliceInfo> networkSliceInfo)
1221 {
1222 if (networkSliceInfo == nullptr) {
1223 return;
1224 }
1225 RouteSelectionDescriptorInfo rsd(0, "", "", false, 0);
1226 networkSliceInfo->setRouteSelectionDescriptor(rsd);
1227 ChangeNetworkSliceCounter(CHANGE_TYPE_DECREASE);
1228 }
1229
UnbindProcessToNetworkForSingleUid(int uid,std::shared_ptr<NetworkSliceInfo> nsi,bool isNeedToRemoveUid)1230 void HwNetworkSliceManager::UnbindProcessToNetworkForSingleUid(int uid,
1231 std::shared_ptr<NetworkSliceInfo> nsi, bool isNeedToRemoveUid)
1232 {
1233 if (nsi == nullptr || nsi->isMatchAll()) {
1234 return;
1235 }
1236 auto entries = nsi->getSliceRouteInfos();
1237 for (auto iter = entries.begin(); iter != entries.end(); iter++) {
1238 auto tds = iter->first;
1239 std::shared_ptr<TrafficDescriptorsInfo> td = std::make_shared<TrafficDescriptorsInfo>(tds);
1240 auto uids = nsi->getUsedUids(tds);
1241 if (nsi->isUidRouteBindType(td) && nsi->isInUsedUids(uid, tds)) {
1242 if (isNeedToRemoveUid) {
1243 UnbindUids(nsi->getNetId(), std::to_string(uid), tds.getUrspPrecedence());
1244 nsi->removeUid(uid, tds);
1245 }
1246 nsi->removeUsedUid(uid, tds);
1247 nsi->removeSignedUid(uid, tds);
1248 nsi->getNetworkCallback()->RemoveRequestUid(uid);
1249 }
1250 if (nsi->isUsedUidEmpty(tds)) {
1251 entries.erase(iter->first);
1252 }
1253 }
1254 if (nsi->getSliceRouteInfos().empty()) {
1255 ReleaseNetworkSlice(nsi);
1256 }
1257 }
1258
HandleUidRemoved(std::string packageName)1259 void HwNetworkSliceManager::HandleUidRemoved(std::string packageName)
1260 {
1261 if (!g_isNrSliceSupport) {
1262 return;
1263 }
1264 std::set<int> removedUids = DelayedSingleton<NetworkSliceService>::GetInstance()->GetUidsByBundleName(packageName);
1265 if (removedUids.empty()) {
1266 return;
1267 }
1268 for (int uid : removedUids) {
1269 for (auto nsi : mNetworkSliceInfos) {
1270 UnbindProcessToNetworkForSingleUid(uid, nsi, true);
1271 }
1272 }
1273 }
1274
HandleUidGone(int uid)1275 void HwNetworkSliceManager::HandleUidGone(int uid)
1276 {
1277 if (!g_isNrSliceSupport) {
1278 return;
1279 }
1280 for (auto nsi : mNetworkSliceInfos) {
1281 UnbindProcessToNetworkForSingleUid(uid, nsi, false);
1282 }
1283 }
1284
ReleaseNetworkSliceByApp(int32_t uid)1285 void HwNetworkSliceManager::ReleaseNetworkSliceByApp(int32_t uid)
1286 {
1287 for (auto sliceInfo : mNetworkSliceInfos) {
1288 if (sliceInfo == nullptr) {
1289 continue;
1290 }
1291
1292 auto tds = sliceInfo->getTrafficDescriptorsInfos();
1293 for (auto td : tds) {
1294 auto uids = sliceInfo->getUids(td);
1295 auto iter = std::find(uids.begin(), uids.end(), uid);
1296 if (iter != uids.end()) {
1297 UnbindProcessToNetworkForSingleUid(uid, sliceInfo, true);
1298 }
1299 }
1300 }
1301 }
1302
BindAllProccessToNetwork()1303 void HwNetworkSliceManager::BindAllProccessToNetwork()
1304 {
1305 for (auto nsi : mNetworkSliceInfos) {
1306 if (nsi->isMatchAll()) {
1307 continue;
1308 }
1309 nsi->clearUsedUids();
1310 sptr<NetConnCallback> nsc = nsi->getNetworkCallback();
1311 int result = ERROR_INVALID_PARAM;
1312 auto entries = nsi->getSliceRouteInfos();
1313 for (auto it = entries.begin(); it != entries.end(); ++it) {
1314 const TrafficDescriptorsInfo& tds = it->first;
1315 if (tds.isMatchNetworkCap()) {
1316 // intercept request isn't rebind when wifi or dds recovery.
1317 continue;
1318 }
1319 if (nsc != nullptr && nsi->getNetId() != NetworkSliceInfo::INVALID_NET_ID) {
1320 std::shared_ptr<TrafficDescriptorsInfo> tdsptr = std::make_shared<TrafficDescriptorsInfo>(tds);
1321 result = BindNetworkSliceProcessToNetwork(INVALID_UID, nsc->GetRequestUids(),
1322 nsi, nsi->getFqdnIps(tds), tdsptr);
1323 }
1324 NETMGR_EXT_LOG_I("bindAllProccessToNetwork, bind uid to network slice result = %{public}d", result);
1325 }
1326 }
1327 }
1328
onWifiNetworkStateChanged(bool isWifiConnect)1329 void HwNetworkSliceManager::onWifiNetworkStateChanged(bool isWifiConnect)
1330 {
1331 if (isWifiConnect) {
1332 UnbindAllProccessToNetwork();
1333 } else {
1334 RestoreSliceEnvironment();
1335 BindAllProccessToNetwork();
1336 }
1337 }
1338
DumpNetworkSliceInfos()1339 void HwNetworkSliceManager::DumpNetworkSliceInfos()
1340 {
1341 NETMGR_EXT_LOG_E("DumpNetworkSliceInfos size = %{public}d", (int)mNetworkSliceInfos.size());
1342 for (auto sliceInfo : mNetworkSliceInfos) {
1343 if (sliceInfo != nullptr) {
1344 std::shared_ptr<RouteSelectionDescriptorInfo> rsdinfo = sliceInfo->getRouteSelectionDescriptor();
1345 if (rsdinfo == nullptr) {
1346 NETMGR_EXT_LOG_I("DumpNetworkSliceInfos rsdinfo == nullptr");
1347 return;
1348 }
1349 NETMGR_EXT_LOG_E("NetworkSliceInfos SscMode = %{public}d", rsdinfo->getSscMode());
1350 NETMGR_EXT_LOG_E("NetworkSliceInfos Snssai = %{public}s", rsdinfo->getSnssai().c_str());
1351 NETMGR_EXT_LOG_E("NetworkSliceInfos Dnn = %{public}s", rsdinfo->getDnn().c_str());
1352 NETMGR_EXT_LOG_E("NetworkSliceInfos PduSessionType = %{public}d", rsdinfo->getPduSessionType());
1353 NETMGR_EXT_LOG_E("NetworkSliceInfos isMatchAll = %{public}d", rsdinfo->isMatchAll());
1354 return;
1355 }
1356 }
1357 NETMGR_EXT_LOG_E("DumpNetworkSliceInfos sliceInfo == nullptr");
1358 }
1359
1360 }
1361 }
1362