• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2025-2026 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "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