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