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 FqdnIps newFqdnIps = *fqdnIps;
602 std::shared_ptr<FqdnIps> nsiFqdnIps = nsi->getFqdnIps(*tds);
603 if (nsiFqdnIps == nullptr) {
604 nsi->setFqdnIps(newFqdnIps, *tds);
605 } else {
606 newFqdnIps = nsiFqdnIps->getNewFqdnIps(*fqdnIps);
607 nsi->mergeFqdnIps(*fqdnIps, *tds);
608 }
609 FillIpBindParasForFqdn(bindParas, newFqdnIps);
610 } else {
611 FillIpBindParasForIpTriad(bindParas, tds);
612 }
613 }
614
FillNetworkSliceRequest(std::shared_ptr<TrafficDescriptorsInfo> td)615 std::map<std::string, std::string> HwNetworkSliceManager::FillNetworkSliceRequest(
616 std::shared_ptr<TrafficDescriptorsInfo> td)
617 {
618 NETMGR_EXT_LOG_I("FillNetworkSliceRequest");
619 std::string appId;
620 int ret = DelayedSingleton<NetworkSliceService>::GetInstance()->GetBundleNameForUid(td->getUid(), appId);
621 if (ret != NETMANAGER_EXT_SUCCESS) {
622 NETMGR_EXT_LOG_E("Error GetBundleNameForUid fail");
623 }
624 NETMGR_EXT_LOG_E("FillNetworkSliceRequest Uid = %{public}d, appId = %{public}s", td->getUid(), appId.c_str());
625 appId = REQUEST_NETWORK_SLICE_OS_ID + appId;
626 std::string ip = td->getIp().address_;
627 std::map<std::string, std::string> bundle;
628
629 if (!appId.empty()) {
630 bundle[REQUEST_NETWORK_SLICE_APPID] = appId;
631 NETMGR_EXT_LOG_I("bundle appId = %{public}s", bundle[REQUEST_NETWORK_SLICE_APPID].c_str());
632 }
633 if (!td->getDnn().empty()) {
634 bundle[REQUEST_NETWORK_SLICE_DNN] = td->getDnn();
635 NETMGR_EXT_LOG_I("bundle DNN = %{public}s", bundle[REQUEST_NETWORK_SLICE_DNN].c_str());
636 }
637 if (!td->getFqdn().empty()) {
638 bundle[REQUEST_NETWORK_SLICE_FQDN] = td->getFqdn();
639 NETMGR_EXT_LOG_I("bundle FQDN = %{public}s", bundle[REQUEST_NETWORK_SLICE_FQDN].c_str());
640 }
641 if (!ip.empty()) {
642 bundle[REQUEST_NETWORK_SLICE_IP] = ip;
643 NETMGR_EXT_LOG_I("bundle IP = %{public}s", bundle[REQUEST_NETWORK_SLICE_IP].c_str());
644 }
645 if (!td->getProtocolId().empty()) {
646 bundle[REQUEST_NETWORK_SLICE_PROTOCOL] = td->getProtocolId();
647 NETMGR_EXT_LOG_I("bundle PROTOCOL = %{public}s", bundle[REQUEST_NETWORK_SLICE_PROTOCOL].c_str());
648 }
649 if (!td->getRemotePort().empty()) {
650 bundle[REQUEST_NETWORK_SLICE_REMOTE_PORT] = td->getRemotePort();
651 NETMGR_EXT_LOG_I("bundle REMOTE_PORT = %{public}s", bundle[REQUEST_NETWORK_SLICE_REMOTE_PORT].c_str());
652 }
653 if (td->getCct() != 0) {
654 bundle[REQUEST_NETWORK_SLICE_CONNECTION_CAPABILITY] = std::to_string(td->getCct());
655 NETMGR_EXT_LOG_I("bundle CONNECTION_CAPABILITY = %{public}s",
656 bundle[REQUEST_NETWORK_SLICE_CONNECTION_CAPABILITY].c_str());
657 }
658 return bundle;
659 }
660
FillIpBindParasForFqdn(std::map<std::string,std::string> & bindParas,const FqdnIps & newFqdnIps)661 void HwNetworkSliceManager::FillIpBindParasForFqdn(
662 std::map<std::string, std::string>& bindParas, const FqdnIps& newFqdnIps)
663 {
664 if (!bindParas.empty() && !newFqdnIps.getIpv4AddrAndMask().empty() && !newFqdnIps.getIpv6AddrAndPrefix().empty()) {
665 bindParas[BIND_ROUTE_IPV4_NUM] = std::to_string(newFqdnIps.getIpv4Num());
666 bindParas[BIND_ROUTE_IPV4_ADDRANDMASK] = ConvertUint8vecToString(newFqdnIps.getIpv4AddrAndMask());
667 bindParas[BIND_ROUTE_IPV6_NUM] = std::to_string(newFqdnIps.getIpv6Num());
668 bindParas[BIND_ROUTE_IPV6_ADDRANDPREFIX] = ConvertUint8vecToString(newFqdnIps.getIpv6AddrAndPrefix());
669 bindParas[BIND_ROUTE_PROTOCOL_IDS] = "";
670 bindParas[BIND_ROUTE_REMOTE_PORTS] = "";
671 }
672 }
673
FillIpBindParasForIpTriad(std::map<std::string,std::string> & bindParas,std::shared_ptr<TrafficDescriptorsInfo> tds)674 void HwNetworkSliceManager::FillIpBindParasForIpTriad(std::map<std::string, std::string>& bindParas,
675 std::shared_ptr<TrafficDescriptorsInfo> tds)
676 {
677 if (!bindParas.empty() && tds != nullptr) {
678 bindParas[BIND_ROUTE_IPV4_NUM] = std::to_string(tds->getIpv4Num());
679 bindParas[BIND_ROUTE_IPV4_ADDRANDMASK] = ConvertUint8vecToString(tds->getIpv4AddrAndMask());
680 bindParas[BIND_ROUTE_IPV6_NUM] = std::to_string(tds->getIpv6Num());
681 bindParas[BIND_ROUTE_IPV6_ADDRANDPREFIX] = ConvertUint8vecToString(tds->getIpv6AddrAndPrefix());
682 bindParas[BIND_ROUTE_PROTOCOL_IDS] = tds->getProtocolIds();
683 bindParas[BIND_ROUTE_REMOTE_PORTS] = tds->getRemotePorts();
684 }
685 }
686
GetAutoUids(const std::shared_ptr<TrafficDescriptorsInfo> & tds)687 std::set<int> HwNetworkSliceManager::GetAutoUids(const std::shared_ptr<TrafficDescriptorsInfo>& tds)
688 {
689 if (tds == nullptr) {
690 return std::set<int>();
691 }
692 std::string uidsStr = GetUidsFromAppIds(tds->getAppIds());
693 if (uidsStr.empty()) {
694 NETMGR_EXT_LOG_E("GetAutoUids uidsStr.empty()");
695 return std::set<int>();
696 }
697 std::vector<std::string> uidStrs = Split(uidsStr, SEPARATOR_FOR_NORMAL_DATA);
698 if (uidStrs.empty()) {
699 NETMGR_EXT_LOG_E("GetAutoUids uidStrs.empty()");
700 return std::set<int>();
701 }
702 std::set<int> tempUids;
703 for (const auto& uidStr : uidStrs) {
704 if (!uidStr.empty()) {
705 tempUids.insert(std::stoi(uidStr));
706 }
707 }
708 NETMGR_EXT_LOG_E("bindNetworkSliceProcessToNetwork getUidsFromAppIds= %{public}s", uidsStr.c_str());
709 return tempUids;
710 }
711
GetUidsFromAppIds(const std::string & originAppIds)712 std::string HwNetworkSliceManager::GetUidsFromAppIds(const std::string& originAppIds)
713 {
714 NETMGR_EXT_LOG_I("GetUidsFromAppIds originAppIds = %{public}s", originAppIds.c_str());
715 std::set<std::string> appIds = GetAppIdsWithoutOsId(originAppIds);
716 if (appIds.empty()) {
717 NETMGR_EXT_LOG_E("GetUidsFromAppIds appIds.empty()");
718 return "";
719 }
720 NETMGR_EXT_LOG_I("GetUidsFromAppIds appIds.size() = %{public}d", (int)appIds.size());
721 std::string result = std::accumulate(appIds.begin(), appIds.end(), std::string{},
722 [this](const std::string& current, const std::string& element) {
723 return current +
724 std::to_string(DelayedSingleton<NetworkSliceService>::GetInstance()->GetUidByBundleName(element)) +
725 SEPARATOR_FOR_NORMAL_DATA;
726 });
727 NETMGR_EXT_LOG_I("getUidsFromAppIds, uids = %{public}s", result.c_str());
728 return result;
729 }
730
GetAppIdsWithoutOsId(const std::string & originAppIds)731 std::set<std::string> HwNetworkSliceManager::GetAppIdsWithoutOsId(const std::string& originAppIds)
732 {
733 NETMGR_EXT_LOG_I("GetAppIdsWithoutOsId");
734 std::vector<std::string> orgins = Split(originAppIds, SEPARATOR_FOR_NORMAL_DATA);
735 if (orgins.empty()) {
736 NETMGR_EXT_LOG_E("getAppIdsWithoutOsId orgins == null, should not run here.");
737 return std::set<std::string>();
738 }
739 std::set<std::string> appIds;
740 for (const auto& osIdAppId : orgins) {
741 NETMGR_EXT_LOG_I("GetAppIdsWithoutOsId osIdAppId = %{public}s", osIdAppId.c_str());
742 HwOsAppId osAppId = HwOsAppId::Create(osIdAppId);
743 NETMGR_EXT_LOG_I("GetAppIdsWithoutOsId Create OsId = %{public}s, AppId = %{public}s",
744 osAppId.getOsId().c_str(), osAppId.getAppId().c_str());
745 if (osAppId.getAppId() == "") {
746 continue;
747 }
748 appIds.insert(osAppId.getAppId());
749 }
750 return appIds;
751 }
752
RequestNetwork(int uid,std::shared_ptr<NetworkSliceInfo> networkSliceInfo)753 void HwNetworkSliceManager::RequestNetwork(int uid, std::shared_ptr<NetworkSliceInfo> networkSliceInfo)
754 {
755 if (uid == INVALID_UID) {
756 return;
757 }
758 if (networkSliceInfo == nullptr || networkSliceInfo->getNetworkRequest() == nullptr) {
759 NETMGR_EXT_LOG_E("networkSliceInfo is null with no request id");
760 return;
761 }
762 RequestNetwork(uid, networkSliceInfo, 0, REQUEST_NETWORK_TIMEOUT);
763 }
764
RequestNetwork(int uid,std::shared_ptr<NetworkSliceInfo> networkSliceInfo,int requestId,int timeoutMs)765 void HwNetworkSliceManager::RequestNetwork(int uid, std::shared_ptr<NetworkSliceInfo> networkSliceInfo,
766 int requestId, int timeoutMs)
767 {
768 NETMGR_EXT_LOG_I("HwNetworkSliceManager::RequestNetwork");
769 if (networkSliceInfo == nullptr) {
770 NETMGR_EXT_LOG_E("requestNetwork networkSliceInfo is null");
771 return;
772 }
773 std::shared_ptr<RouteSelectionDescriptorInfo> rsd = networkSliceInfo->getRouteSelectionDescriptor();
774 std::shared_ptr<TrafficDescriptorsInfo> tds = networkSliceInfo->getTempTrafficDescriptors();
775 if (rsd == nullptr || tds == nullptr) {
776 NETMGR_EXT_LOG_E("requestNetwork rsd is null or tds is null");
777 return;
778 }
779 sptr<NetSpecifier> request = networkSliceInfo->getNetworkRequest();
780 if (request == nullptr) {
781 // normally it can not run here.
782 NETMGR_EXT_LOG_E("Can not get request by capability:%{public}d", networkSliceInfo->getNetworkCapability());
783 CleanRouteSelectionDescriptor(networkSliceInfo);
784 return;
785 }
786 FillRsdIntoNetworkRequest(request, *rsd, *tds); // need check
787
788 sptr<NetConnCallback> callback = networkSliceInfo->getNetworkCallback();
789 if (callback == nullptr) {
790 callback = sptr<NetConnCallback>(new NetConnCallback());
791 }
792 if (callback == nullptr) {
793 return;
794 }
795 callback->SetNetCap(*request->netCapabilities_.netCaps_.begin());
796 callback->CacheRequestUid(uid);
797 callback->SetUid(uid);
798 int32_t ret = NetConnClient::GetInstance().RequestNetConnection(request, callback, timeoutMs);
799 networkSliceInfo->setNetworkCallback(callback);
800 }
801
FillRsdIntoNetworkRequest(const sptr<NetSpecifier> request,const RouteSelectionDescriptorInfo & rsd,const TrafficDescriptorsInfo & tds)802 void HwNetworkSliceManager::FillRsdIntoNetworkRequest(const sptr<NetSpecifier> request,
803 const RouteSelectionDescriptorInfo& rsd, const TrafficDescriptorsInfo& tds)
804 {
805 NETMGR_EXT_LOG_I("FillRsdIntoNetworkRequest");
806 std::map<std::string, std::string> bundle;
807 bundle["dnn"] = rsd.getDnn();
808 bundle["snssai"] = rsd.getSnssai();
809 bundle["sscmode"] = std::to_string(rsd.getSscMode());
810 bundle["pdusessiontype"] = std::to_string(rsd.getPduSessionType());
811 bundle["routebitmap"] = std::to_string(tds.getRouteBitmap());
812 NETMGR_EXT_LOG_I("FillRsdIntoNetworkRequest sscMode = %{public}d", rsd.getSscMode());
813 NETMGR_EXT_LOG_I("FillRsdIntoNetworkRequest dnn = %{public}s", rsd.getDnn().c_str());
814 NETMGR_EXT_LOG_I("FillRsdIntoNetworkRequest snssai = %{public}s", rsd.getSnssai().c_str());
815 NETMGR_EXT_LOG_I("FillRsdIntoNetworkRequest pdusession = %{public}d", rsd.getPduSessionType());
816 NETMGR_EXT_LOG_I("FillRsdIntoNetworkRequest routebitmap = %{public}d", tds.getRouteBitmap());
817 networkSliceParas[*request->netCapabilities_.netCaps_.begin()] = bundle;
818 }
819
GetRSDByNetCap(int32_t netcap,std::map<std::string,std::string> & sliceParasbyNetcap)820 void HwNetworkSliceManager::GetRSDByNetCap(int32_t netcap, std::map<std::string, std::string>& sliceParasbyNetcap)
821 {
822 NETMGR_EXT_LOG_I("GetRSDByNetCap");
823 auto it = networkSliceParas.find(netcap);
824 if (it != networkSliceParas.end()) {
825 sliceParasbyNetcap = it->second;
826 }
827 }
828
ChangeNetworkSliceCounter(int changeType)829 void HwNetworkSliceManager::ChangeNetworkSliceCounter(int changeType)
830 {
831 switch (changeType) {
832 case CHANGE_TYPE_INCREASE:
833 mNetworkSliceCounter.fetch_add(1, std::memory_order_relaxed);
834 break;
835 case CHANGE_TYPE_DECREASE:
836 mNetworkSliceCounter.fetch_sub(1, std::memory_order_relaxed);
837 break;
838 case CHANGE_TYPE_ZEROING:
839 mNetworkSliceCounter.store(0, std::memory_order_relaxed);
840 break;
841 default:
842 NETMGR_EXT_LOG_I("wrong type of network slice counter: %{public}d", changeType);
843 break;
844 }
845 }
846
isCanRequestNetwork()847 bool HwNetworkSliceManager::isCanRequestNetwork()
848 {
849 return DelayedSingleton<NetworkSliceManager>::GetInstance()->isCanRequestNetwork();
850 }
851
isCanMatchNetworkSlices()852 bool HwNetworkSliceManager::isCanMatchNetworkSlices()
853 {
854 if (!isEnvironmentReady()) {
855 return false;
856 }
857 if (!isCanRequestNetwork()) {
858 return false;
859 }
860 return true;
861 }
862
isEnvironmentReady()863 bool HwNetworkSliceManager::isEnvironmentReady()
864 {
865 if (!g_isNrSliceSupport) {
866 return false;
867 }
868 if (!mIsReady) {
869 return false;
870 }
871 if (!isUrspAvailable()) {
872 return false;
873 }
874 return true;
875 }
876
isUrspAvailable()877 bool HwNetworkSliceManager::isUrspAvailable()
878 {
879 return mIsUrspAvailable;
880 }
881
SetUrspAvailable(bool urspAvailable)882 void HwNetworkSliceManager::SetUrspAvailable(bool urspAvailable)
883 {
884 mIsUrspAvailable = urspAvailable;
885 }
886
isNeedToRequestSliceForAppIdAuto(std::string appId)887 bool HwNetworkSliceManager::isNeedToRequestSliceForAppIdAuto(std::string appId)
888 {
889 if (isCooperativeApp(appId)) {
890 return false;
891 }
892 HwOsAppId id = HwOsAppId::Create(REQUEST_NETWORK_SLICE_OS_ID + appId);
893 return std::find(mWhiteListForOsAppId.begin(), mWhiteListForOsAppId.end(), id)
894 != mWhiteListForOsAppId.end();
895 }
896
isNeedToRequestSliceForFqdnAuto(std::string fqdn,int uid)897 bool HwNetworkSliceManager::isNeedToRequestSliceForFqdnAuto(std::string fqdn, int uid)
898 {
899 if (isCooperativeApp(uid)) {
900 return false;
901 }
902 return std::find(mWhiteListForFqdn.begin(), mWhiteListForFqdn.end(), fqdn)
903 != mWhiteListForFqdn.end();
904 }
905
isNeedToRequestSliceForDnnAuto(std::string dnn,int uid)906 bool HwNetworkSliceManager::isNeedToRequestSliceForDnnAuto(std::string dnn, int uid)
907 {
908 if (isCooperativeApp(uid)) {
909 return false;
910 }
911 return std::find(mWhiteListForDnn.begin(), mWhiteListForDnn.end(), dnn)
912 != mWhiteListForDnn.end();
913 }
914
isCooperativeApp(int uid)915 bool HwNetworkSliceManager::isCooperativeApp(int uid)
916 {
917 std::string packageName;
918 int ret = DelayedSingleton<NetworkSliceService>::GetInstance()->GetBundleNameForUid(uid, packageName);
919 if (ret != NETMANAGER_EXT_SUCCESS) {
920 NETMGR_EXT_LOG_E("Error GetBundleNameForUid fail");
921 return false;
922 }
923 return isCooperativeApp(packageName);
924 }
925
isCooperativeApp(std::string packageName)926 bool HwNetworkSliceManager::isCooperativeApp(std::string packageName)
927 {
928 return std::find(mWhiteListForCooperativeApp.begin(), mWhiteListForCooperativeApp.end(), packageName)
929 != mWhiteListForCooperativeApp.end();
930 }
931
ReadAppIdWhiteList(TrafficDescriptorWhiteList whiteList)932 void HwNetworkSliceManager::ReadAppIdWhiteList(TrafficDescriptorWhiteList whiteList)
933 {
934 std::string osAppIds = whiteList.osAppIds;
935 if (!osAppIds.empty()) {
936 mWhiteListForOsAppId.clear();
937 std::vector<std::string> values = Split(osAppIds, SEPARATOR_FOR_NORMAL_DATA);
938 if (values.size() != 0) {
939 for (size_t i = 0; i < values.size(); ++i) {
940 mWhiteListForOsAppId.push_back(HwOsAppId::Create(values[i]));
941 }
942 }
943 }
944 }
945
ReadDnnWhiteList(TrafficDescriptorWhiteList whiteList)946 void HwNetworkSliceManager::ReadDnnWhiteList(TrafficDescriptorWhiteList whiteList)
947 {
948 std::string dnns = whiteList.dnns;
949 if (!dnns.empty()) {
950 mWhiteListForDnn.clear();
951 std::vector<std::string> values = Split(dnns, SEPARATOR_FOR_NORMAL_DATA);
952 if (values.size() != 0) {
953 mWhiteListForDnn = values;
954 }
955 }
956 }
957
ReadFqdnWhiteList(TrafficDescriptorWhiteList whiteList)958 void HwNetworkSliceManager::ReadFqdnWhiteList(TrafficDescriptorWhiteList whiteList)
959 {
960 std::string fqdns = whiteList.fqdns;
961 if (!fqdns.empty()) {
962 std::vector<std::string> values = Split(fqdns, SEPARATOR_FOR_NORMAL_DATA);
963 if (values.size() != 0) {
964 mWhiteListForFqdn = values;
965 }
966 }
967 }
968
ReadCctWhiteList(TrafficDescriptorWhiteList whiteList)969 void HwNetworkSliceManager::ReadCctWhiteList(TrafficDescriptorWhiteList whiteList)
970 {
971 std::string ccts = whiteList.cct;
972 if (!ccts.empty()) {
973 std::vector<std::string> values = Split(ccts, SEPARATOR_FOR_NORMAL_DATA);
974 if (values.size() != 0) {
975 mWhiteListForCct = values;
976 }
977 }
978 }
979
UnbindAllProccessToNetwork()980 void HwNetworkSliceManager::UnbindAllProccessToNetwork()
981 {
982 for (auto nsi : mNetworkSliceInfos) {
983 if (nsi->isMatchAll()) {
984 continue;
985 }
986 if (nsi->getNetId() == NetworkSliceInfo::INVALID_NET_ID) {
987 continue;
988 }
989 auto entries = nsi->getSliceRouteInfos();
990 for (auto it = entries.begin(); it != entries.end(); ++it) {
991 const TrafficDescriptorsInfo& tds = it->first;
992 if (tds.isMatchNetworkCap()) {
993 continue;
994 }
995 std::shared_ptr<SliceRouteInfo> sri = nsi->getSliceRouteInfo(tds);
996 if (sri == nullptr) {
997 continue;
998 }
999 UnbindUids(nsi->getNetId(), sri->getUidsStr(), tds.getUrspPrecedence());
1000 }
1001 }
1002 }
1003
CleanEnvironment()1004 void HwNetworkSliceManager::CleanEnvironment()
1005 {
1006 int result = UnbindAllRoute();
1007 NETMGR_EXT_LOG_I("unbind all route, result = %{public}d", result);
1008 for (auto nsi : mNetworkSliceInfos) {
1009 sptr<NetConnCallback> networkCallback = nsi->getNetworkCallback();
1010 if (networkCallback != nullptr) {
1011 NetConnClient::GetInstance().UnregisterNetConnCallback(networkCallback);
1012 OnNetworkLost(networkCallback->GetNetCap(), networkCallback->GetNetId());
1013 }
1014 nsi->clear();
1015 }
1016 mNetworkSliceInfos.clear();
1017 InitNetworkSliceInfos();
1018 networkSliceParas.clear();
1019 NETMGR_EXT_LOG_I("Clean Environment done");
1020 }
1021
UnbindAllRoute()1022 int HwNetworkSliceManager::UnbindAllRoute()
1023 {
1024 std::map<std::string, std::string> input;
1025 input[BIND_ROUTE_NETID] = std::to_string(UNBIND_TYPE_ALL);
1026 input[UNBIND_ROUTE_TYPE] = std::to_string(UNBIND_TYPE_ALL);
1027 int ret = DelayedSingleton<NetworkSliceService>::GetInstance()->DelBindToNetwork(input);
1028 if (ret != NETMANAGER_EXT_SUCCESS) {
1029 NETMGR_EXT_LOG_E("Error UnbindUids fail");
1030 }
1031 return ret;
1032 }
1033
UnbindSingleNetId(int netId)1034 int HwNetworkSliceManager::UnbindSingleNetId(int netId)
1035 {
1036 std::map<std::string, std::string> input;
1037 input[BIND_ROUTE_NETID] = std::to_string(netId);
1038 input[UNBIND_ROUTE_TYPE] = std::to_string(UNBIND_TYPE_NETID);
1039 int ret = DelayedSingleton<NetworkSliceService>::GetInstance()->DelBindToNetwork(input);
1040 if (ret != NETMANAGER_EXT_SUCCESS) {
1041 NETMGR_EXT_LOG_E("Error UnbindUids fail");
1042 }
1043 return ret;
1044 }
1045
UnbindUids(uint netId,const std::string & uids,uint8_t urspPrecedence)1046 int HwNetworkSliceManager::UnbindUids(uint netId, const std::string& uids, uint8_t urspPrecedence)
1047 {
1048 std::map<std::string, std::string> input;
1049 input[BIND_ROUTE_NETID] = std::to_string(netId);
1050 input[BIND_ROUTE_UID] = uids;
1051 input[BIND_ROUTE_URSP_PRECEDENCE] = std::to_string(static_cast<int>(urspPrecedence));
1052 input[UNBIND_ROUTE_TYPE] = std::to_string(UNBIND_TYPE_UIDS);
1053 int ret = DelayedSingleton<NetworkSliceService>::GetInstance()->DelBindToNetwork(input);
1054 if (ret != NETMANAGER_EXT_SUCCESS) {
1055 NETMGR_EXT_LOG_E("Error UnbindUids fail");
1056 }
1057 return ret;
1058 }
1059
BindProcessToNetwork(std::map<std::string,std::string> bindParas)1060 int HwNetworkSliceManager::BindProcessToNetwork(std::map<std::string, std::string> bindParas)
1061 {
1062 NETMGR_EXT_LOG_I("BindProcessToNetwork");
1063 int ret = DelayedSingleton<NetworkSliceService>::GetInstance()->BindToNetwork(bindParas);
1064 if (ret != NETMANAGER_EXT_SUCCESS) {
1065 NETMGR_EXT_LOG_E("Error UnbindUids fail");
1066 }
1067 return ret;
1068 }
1069
UnbindProcessToNetwork(std::string uids,int netId)1070 int HwNetworkSliceManager::UnbindProcessToNetwork(std::string uids, int netId)
1071 {
1072 std::map<std::string, std::string> input;
1073 input[BIND_ROUTE_NETID] = std::to_string(netId);
1074 input[BIND_ROUTE_UID] = uids;
1075 int ret = DelayedSingleton<NetworkSliceService>::GetInstance()->DelBindToNetwork(input);
1076 if (ret != NETMANAGER_EXT_SUCCESS) {
1077 NETMGR_EXT_LOG_E("Error UnbindUids fail");
1078 }
1079 return ret;
1080 }
1081
1082
RestoreSliceEnvironment()1083 void HwNetworkSliceManager::RestoreSliceEnvironment()
1084 {
1085 RequestMatchAllSlice();
1086 TryToActivateSliceForForegroundApp();
1087 }
1088
RequestMatchAllSlice()1089 void HwNetworkSliceManager::RequestMatchAllSlice()
1090 {
1091 if (!mHasMatchAllSlice == true || mIsMatchAllRequsted == true || mIsMatchRequesting == true) {
1092 return;
1093 }
1094
1095 if (!isCanRequestNetwork()) {
1096 return;
1097 }
1098 mIsMatchRequesting = true;
1099 for (std::shared_ptr<NetworkSliceInfo> nsi : mNetworkSliceInfos) {
1100 if (nsi->isMatchAll()) {
1101 RequestNetwork(INVALID_UID, nsi);
1102 break;
1103 }
1104 }
1105 }
1106
OnNetworkAvailable(NetCap netCap,int32_t netId)1107 void HwNetworkSliceManager::OnNetworkAvailable(NetCap netCap, int32_t netId)
1108 {
1109 NETMGR_EXT_LOG_I("HwNetworkSliceManager:OnNetworkAvailable");
1110 std::shared_ptr<NetworkSliceInfo> networkSliceInfo = GetNetworkSliceInfoByParaNetCap(netCap);
1111 if (networkSliceInfo == nullptr) {
1112 return;
1113 }
1114 networkSliceInfo->setNetId(netId);
1115 if (networkSliceInfo->isMatchAll()) {
1116 NETMGR_EXT_LOG_E("match_all do not need to bind route");
1117 mIsMatchAllRequsted.store(true, std::memory_order_relaxed);
1118 mIsMatchRequesting = false;
1119 return;
1120 }
1121 if (networkSliceInfo->getNetworkCallback() == nullptr) {
1122 NETMGR_EXT_LOG_E("getNetworkCallback() == nullptr");
1123 return;
1124 }
1125 int32_t uid = networkSliceInfo->getNetworkCallback()->GetUid();
1126 std::set<int32_t> triggerActivationUids = networkSliceInfo->getNetworkCallback()->GetRequestUids();
1127 for (TrafficDescriptorsInfo td : networkSliceInfo->getTrafficDescriptorsInfos()) {
1128 std::shared_ptr<TrafficDescriptorsInfo> tds = std::make_shared<TrafficDescriptorsInfo>(td);
1129 BindNetworkSliceProcessToNetwork(uid,
1130 triggerActivationUids,
1131 networkSliceInfo,
1132 networkSliceInfo->getFqdnIps(td),
1133 tds);
1134
1135 std::shared_ptr<SliceRouteInfo> sri = networkSliceInfo->getSliceRouteInfo(td);
1136 if (sri == nullptr) {
1137 continue;
1138 }
1139 for (FqdnIps fqdnIp : sri->getWaittingFqdnIps()) {
1140 std::shared_ptr<FqdnIps> fqdnIps = std::make_shared<FqdnIps>(fqdnIp);
1141 BindNetworkSliceProcessToNetwork(uid, triggerActivationUids, networkSliceInfo, fqdnIps, tds);
1142 }
1143
1144 // clear WaittingFqdnIps, because it only used in activating slice network
1145 networkSliceInfo->clearWaittingFqdnIps(td);
1146 NETMGR_EXT_LOG_I("bind success networkSliceInfo");
1147 }
1148 }
1149
OnNetworkLost(NetCap netCap,int32_t netId)1150 void HwNetworkSliceManager::OnNetworkLost(NetCap netCap, int32_t netId)
1151 {
1152 NETMGR_EXT_LOG_I("HwNetworkSliceManager:OnNetworkLost");
1153 std::shared_ptr<NetworkSliceInfo> networkSliceInfo = GetNetworkSliceInfoByParaNetCap(netCap);
1154 if (networkSliceInfo == nullptr) {
1155 NETMGR_EXT_LOG_I("OnNetworkLost networkSliceInfo == nullptr");
1156 return;
1157 }
1158 if (networkSliceInfo->isMatchAll()) {
1159 NETMGR_EXT_LOG_E("match_all do not need to bind route");
1160 mIsMatchAllRequsted.store(false, std::memory_order_relaxed);
1161 mIsMatchRequesting = false;
1162 return;
1163 }
1164
1165 networkSliceInfo->clearUsedUids();
1166 int result = UnbindSingleNetId(networkSliceInfo->getNetId());
1167 NETMGR_EXT_LOG_I("unbind uid to network slice result = %{public}d", result);
1168 }
1169
OnNetworkUnavailable(NetCap netCap)1170 void HwNetworkSliceManager::OnNetworkUnavailable(NetCap netCap)
1171 {
1172 NETMGR_EXT_LOG_I("HwNetworkSliceManager:OnNetworkUnavailable");
1173 std::shared_ptr<NetworkSliceInfo> networkSliceInfo = GetNetworkSliceInfoByParaNetCap(netCap);
1174 if (networkSliceInfo == nullptr) {
1175 return;
1176 }
1177 if (networkSliceInfo->isMatchAll()) {
1178 NETMGR_EXT_LOG_E("match_all do not need to bind route");
1179 mIsMatchAllRequsted.store(false, std::memory_order_relaxed);
1180 mIsMatchRequesting = false;
1181 return;
1182 }
1183 RecoveryNetworkSlice(networkSliceInfo);
1184 }
1185
RecoveryNetworkSlice(std::shared_ptr<NetworkSliceInfo> networkSliceInfo)1186 void HwNetworkSliceManager::RecoveryNetworkSlice(std::shared_ptr<NetworkSliceInfo> networkSliceInfo)
1187 {
1188 if (networkSliceInfo == nullptr) {
1189 return;
1190 }
1191 UnbindSingleNetId(networkSliceInfo->getNetId());
1192 sptr<NetConnCallback> networkCallback = networkSliceInfo->getNetworkCallback();
1193 NetConnClient::GetInstance().UnregisterNetConnCallback(networkCallback);
1194 networkSliceInfo->setNetId(NetworkSliceInfo::INVALID_NET_ID);
1195 networkSliceInfo->clearUids();
1196 networkSliceInfo->clearUsedUids();
1197 networkSliceInfo->clear();
1198
1199 ChangeNetworkSliceCounter(CHANGE_TYPE_DECREASE);
1200 }
1201
ReleaseNetworkSlice(std::shared_ptr<NetworkSliceInfo> networkSliceInfo)1202 void HwNetworkSliceManager::ReleaseNetworkSlice(std::shared_ptr<NetworkSliceInfo> networkSliceInfo)
1203 {
1204 if (networkSliceInfo == nullptr) {
1205 return;
1206 }
1207 UnbindSingleNetId(networkSliceInfo->getNetId());
1208 sptr<NetConnCallback> networkCallback = networkSliceInfo->getNetworkCallback();
1209 if (networkCallback != nullptr) {
1210 NetConnClient::GetInstance().UnregisterNetConnCallback(networkCallback);
1211 OnNetworkLost(networkCallback->GetNetCap(), networkCallback->GetNetId());
1212 }
1213 networkSliceInfo->clear();
1214 CleanRouteSelectionDescriptor(networkSliceInfo);
1215 }
1216
CleanRouteSelectionDescriptor(std::shared_ptr<NetworkSliceInfo> networkSliceInfo)1217 void HwNetworkSliceManager::CleanRouteSelectionDescriptor(std::shared_ptr<NetworkSliceInfo> networkSliceInfo)
1218 {
1219 if (networkSliceInfo == nullptr) {
1220 return;
1221 }
1222 RouteSelectionDescriptorInfo rsd(0, "", "", false, 0);
1223 networkSliceInfo->setRouteSelectionDescriptor(rsd);
1224 ChangeNetworkSliceCounter(CHANGE_TYPE_DECREASE);
1225 }
1226
UnbindProcessToNetworkForSingleUid(int uid,std::shared_ptr<NetworkSliceInfo> nsi,bool isNeedToRemoveUid)1227 void HwNetworkSliceManager::UnbindProcessToNetworkForSingleUid(int uid,
1228 std::shared_ptr<NetworkSliceInfo> nsi, bool isNeedToRemoveUid)
1229 {
1230 if (nsi == nullptr || nsi->isMatchAll()) {
1231 return;
1232 }
1233 auto entries = nsi->getSliceRouteInfos();
1234 for (auto iter = entries.begin(); iter != entries.end(); iter++) {
1235 auto tds = iter->first;
1236 std::shared_ptr<TrafficDescriptorsInfo> td = std::make_shared<TrafficDescriptorsInfo>(tds);
1237 auto uids = nsi->getUsedUids(tds);
1238 if (nsi->isUidRouteBindType(td) && nsi->isInUsedUids(uid, tds)) {
1239 if (isNeedToRemoveUid) {
1240 UnbindUids(nsi->getNetId(), std::to_string(uid), tds.getUrspPrecedence());
1241 nsi->removeUid(uid, tds);
1242 }
1243 nsi->removeUsedUid(uid, tds);
1244 nsi->removeSignedUid(uid, tds);
1245 nsi->getNetworkCallback()->RemoveRequestUid(uid);
1246 }
1247 if (nsi->isUsedUidEmpty(tds)) {
1248 entries.erase(iter->first);
1249 }
1250 }
1251 if (nsi->getSliceRouteInfos().empty()) {
1252 ReleaseNetworkSlice(nsi);
1253 }
1254 }
1255
HandleUidRemoved(std::string packageName)1256 void HwNetworkSliceManager::HandleUidRemoved(std::string packageName)
1257 {
1258 if (!g_isNrSliceSupport) {
1259 return;
1260 }
1261 std::set<int> removedUids = DelayedSingleton<NetworkSliceService>::GetInstance()->GetUidsByBundleName(packageName);
1262 if (removedUids.empty()) {
1263 return;
1264 }
1265 for (int uid : removedUids) {
1266 for (auto nsi : mNetworkSliceInfos) {
1267 UnbindProcessToNetworkForSingleUid(uid, nsi, true);
1268 }
1269 }
1270 }
1271
HandleUidGone(int uid)1272 void HwNetworkSliceManager::HandleUidGone(int uid)
1273 {
1274 if (!g_isNrSliceSupport) {
1275 return;
1276 }
1277 for (auto nsi : mNetworkSliceInfos) {
1278 UnbindProcessToNetworkForSingleUid(uid, nsi, false);
1279 }
1280 }
1281
ReleaseNetworkSliceByApp(int32_t uid)1282 void HwNetworkSliceManager::ReleaseNetworkSliceByApp(int32_t uid)
1283 {
1284 for (auto sliceInfo : mNetworkSliceInfos) {
1285 if (sliceInfo == nullptr) {
1286 continue;
1287 }
1288
1289 auto tds = sliceInfo->getTrafficDescriptorsInfos();
1290 for (auto td : tds) {
1291 auto uids = sliceInfo->getUids(td);
1292 auto iter = std::find(uids.begin(), uids.end(), uid);
1293 if (iter != uids.end()) {
1294 UnbindProcessToNetworkForSingleUid(uid, sliceInfo, true);
1295 }
1296 }
1297 }
1298 }
1299
BindAllProccessToNetwork()1300 void HwNetworkSliceManager::BindAllProccessToNetwork()
1301 {
1302 for (auto nsi : mNetworkSliceInfos) {
1303 if (nsi->isMatchAll()) {
1304 continue;
1305 }
1306 nsi->clearUsedUids();
1307 sptr<NetConnCallback> nsc = nsi->getNetworkCallback();
1308 int result = ERROR_INVALID_PARAM;
1309 auto entries = nsi->getSliceRouteInfos();
1310 for (auto it = entries.begin(); it != entries.end(); ++it) {
1311 const TrafficDescriptorsInfo& tds = it->first;
1312 if (tds.isMatchNetworkCap()) {
1313 // intercept request isn't rebind when wifi or dds recovery.
1314 continue;
1315 }
1316 if (nsc != nullptr && nsi->getNetId() != NetworkSliceInfo::INVALID_NET_ID) {
1317 std::shared_ptr<TrafficDescriptorsInfo> tdsptr = std::make_shared<TrafficDescriptorsInfo>(tds);
1318 result = BindNetworkSliceProcessToNetwork(INVALID_UID, nsc->GetRequestUids(),
1319 nsi, nsi->getFqdnIps(tds), tdsptr);
1320 }
1321 NETMGR_EXT_LOG_I("bindAllProccessToNetwork, bind uid to network slice result = %{public}d", result);
1322 }
1323 }
1324 }
1325
onWifiNetworkStateChanged(bool isWifiConnect)1326 void HwNetworkSliceManager::onWifiNetworkStateChanged(bool isWifiConnect)
1327 {
1328 if (isWifiConnect) {
1329 UnbindAllProccessToNetwork();
1330 } else {
1331 RestoreSliceEnvironment();
1332 BindAllProccessToNetwork();
1333 }
1334 }
1335
DumpNetworkSliceInfos()1336 void HwNetworkSliceManager::DumpNetworkSliceInfos()
1337 {
1338 NETMGR_EXT_LOG_E("DumpNetworkSliceInfos size = %{public}d", (int)mNetworkSliceInfos.size());
1339 for (auto sliceInfo : mNetworkSliceInfos) {
1340 if (sliceInfo != nullptr) {
1341 std::shared_ptr<RouteSelectionDescriptorInfo> rsdinfo = sliceInfo->getRouteSelectionDescriptor();
1342 if (rsdinfo == nullptr) {
1343 NETMGR_EXT_LOG_I("DumpNetworkSliceInfos rsdinfo == nullptr");
1344 return;
1345 }
1346 NETMGR_EXT_LOG_E("NetworkSliceInfos SscMode = %{public}d", rsdinfo->getSscMode());
1347 NETMGR_EXT_LOG_E("NetworkSliceInfos Snssai = %{public}s", rsdinfo->getSnssai().c_str());
1348 NETMGR_EXT_LOG_E("NetworkSliceInfos Dnn = %{public}s", rsdinfo->getDnn().c_str());
1349 NETMGR_EXT_LOG_E("NetworkSliceInfos PduSessionType = %{public}d", rsdinfo->getPduSessionType());
1350 NETMGR_EXT_LOG_E("NetworkSliceInfos isMatchAll = %{public}d", rsdinfo->isMatchAll());
1351 return;
1352 }
1353 }
1354 NETMGR_EXT_LOG_E("DumpNetworkSliceInfos sliceInfo == nullptr");
1355 }
1356
1357 }
1358 }
1359