• 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 
16 #ifndef NETWORKSLCIEINFO_H
17 #define NETWORKSLCIEINFO_H
18 
19 #include <cstdint>
20 #include <string>
21 #include <vector>
22 #include <iostream>
23 #include <optional>
24 #include "trafficdescriptorsinfo.h"
25 #include "routeselectiondescriptorInfo.h"
26 #include "slicerouteinfo.h"
27 #include "net_specifier.h"
28 #include "net_conn_callback.h"
29 
30 namespace OHOS {
31 namespace NetManagerStandard {
32 
33 class NetworkSliceInfo {
34 public:
35     enum class ParaType {
36         NETWORK_CALLBACK,
37         NETWORK_REQUEST,
38         ROUTE_SELECTION_DESCRIPTOR,
39         NETWORK_REQUEST_ID
40     };
41     static const int INVALID_NET_ID;
42     static const std::string TAG;
43 
isBindCompleted(int uid,const FqdnIps & fqdnIps,const std::shared_ptr<TrafficDescriptorsInfo> & tds)44     bool isBindCompleted(int uid, const FqdnIps& fqdnIps, const std::shared_ptr<TrafficDescriptorsInfo>& tds) const
45     {
46         // Empty mTrafficDescriptors is an exception scenario, can't bind any route for this networkSlice
47         if (tds == nullptr) {
48             return true;
49         }
50         auto it = mSliceRouteInfos.find(*tds);
51         if (it == mSliceRouteInfos.end()) {
52             return false;
53         } else {
54             SliceRouteInfo sri = it->second;
55             return sri.isBindCompleted(uid, fqdnIps, tds->getRouteBindType());
56         }
57     }
58 
clear()59     void clear()
60     {
61         mNetId = INVALID_NET_ID;
62         mNetworkCallback = nullptr;
63         mTempTrafficDescriptors = nullptr;
64         mRouteSelectionDescriptor = nullptr;
65         mNetworkRequests.clear();
66         mSliceRouteInfos.clear();
67     }
68 
clearUsedUids()69     void clearUsedUids()
70     {
71         for (auto& sri : mSliceRouteInfos) {
72             sri.second.clearUsedUids();
73         }
74     }
75 
clearUids()76     void clearUids()
77     {
78         for (auto& sri : mSliceRouteInfos) {
79             sri.second.clearUids();
80         }
81     }
82 
isRightNetworkSliceRsd(RouteSelectionDescriptorInfo rsd,ParaType type)83     bool isRightNetworkSliceRsd(RouteSelectionDescriptorInfo rsd, ParaType type)
84     {
85         NETMGR_EXT_LOG_I("isRightNetworkSliceRsd");
86         std::shared_ptr<RouteSelectionDescriptorInfo> rsdinfo = getRouteSelectionDescriptor();
87         if (rsdinfo != nullptr) {
88             NETMGR_EXT_LOG_I("isRightNetworkSliceRsd, rsdinfo != nullptr");
89             return rsd == *rsdinfo;
90         }
91         return false;
92     }
93 
isRightNetworkSliceNull(ParaType type)94     bool isRightNetworkSliceNull(ParaType type)
95     {
96         return nullptr == getRouteSelectionDescriptor();
97     }
98 
isRightNetworkSliceNetCap(NetCap netCap)99     bool isRightNetworkSliceNetCap(NetCap netCap)
100     {
101         return netCap == mNetworkCapability;
102     }
103 
getNetworkRequestByRequestId(int requestId)104     sptr<NetSpecifier> getNetworkRequestByRequestId(int requestId)
105     {
106         return mNetworkRequests[requestId];
107     }
108 
mergeFqdnIps(const FqdnIps & newFqdnIps,const TrafficDescriptorsInfo & tds)109     void mergeFqdnIps(const FqdnIps& newFqdnIps, const TrafficDescriptorsInfo& tds)
110     {
111         std::shared_ptr<SliceRouteInfo> sri = getSliceRouteInfo(tds);
112         if (sri != nullptr && sri->getFqdnIps() != nullptr) {
113             sri->getFqdnIps()->mergeFqdnIps(newFqdnIps);
114         }
115     }
116 
clearWaittingFqdnIps(const TrafficDescriptorsInfo & tds)117     void clearWaittingFqdnIps(const TrafficDescriptorsInfo& tds)
118     {
119         std::shared_ptr<SliceRouteInfo> sri = getSliceRouteInfo(tds);
120         if (sri != nullptr) {
121             sri->clearWaittingFqdnIps();
122         }
123     }
124 
isMatchAll()125     bool isMatchAll() const
126     {
127         if (mRouteSelectionDescriptor == nullptr) {
128             return false;
129         }
130         return mRouteSelectionDescriptor->isMatchAll();
131     }
132 
isIpTriad(std::shared_ptr<TrafficDescriptorsInfo> & tds)133     bool isIpTriad(std::shared_ptr<TrafficDescriptorsInfo>& tds) const
134     {
135         if (tds == nullptr) {
136             return false;
137         }
138         return tds->isIpTriad();
139     }
140 
getNetId()141     int getNetId() const
142     {
143         return mNetId;
144     }
145 
setNetId(int netId)146     void setNetId(int netId)
147     {
148         mNetId = netId;
149     }
150 
getNetworkCapability()151     int getNetworkCapability() const
152     {
153         return mNetworkCapability;
154     }
155 
setNetworkCapability(int networkCapability)156     void setNetworkCapability(int networkCapability)
157     {
158         mNetworkCapability = networkCapability;
159     }
160 
getNetworkCallback()161     sptr<NetConnCallback> getNetworkCallback() const
162     {
163         return mNetworkCallback;
164     }
165 
setNetworkCallback(sptr<NetConnCallback> callback)166     void setNetworkCallback(sptr<NetConnCallback> callback)
167     {
168         mNetworkCallback = callback;
169     }
170 
getNetworkRequest()171     sptr<NetSpecifier> getNetworkRequest() const
172     {
173         return mNetworkRequest;
174     }
175 
setNetworkRequest(sptr<NetSpecifier> networkRequest)176     void setNetworkRequest(sptr<NetSpecifier> networkRequest)
177     {
178         mNetworkRequest = networkRequest;
179     }
180 
getRouteSelectionDescriptor()181     std::shared_ptr<RouteSelectionDescriptorInfo> getRouteSelectionDescriptor() const
182     {
183         return mRouteSelectionDescriptor;
184     }
185 
setRouteSelectionDescriptor(RouteSelectionDescriptorInfo routeSelectionDescriptor)186     void setRouteSelectionDescriptor(RouteSelectionDescriptorInfo routeSelectionDescriptor)
187     {
188         mRouteSelectionDescriptor = std::make_shared<RouteSelectionDescriptorInfo>(routeSelectionDescriptor);
189     }
190 
getUsedUids(const TrafficDescriptorsInfo & tds)191     std::vector<int> getUsedUids(const TrafficDescriptorsInfo& tds)
192     {
193         std::shared_ptr<SliceRouteInfo> sri = getSliceRouteInfo(tds);
194         if (sri != nullptr) {
195             return sri->getUsedUids();
196         }
197         return std::vector<int>();
198     }
199 
addUsedUid(int uid,const TrafficDescriptorsInfo & tds)200     void addUsedUid(int uid, const TrafficDescriptorsInfo& tds)
201     {
202         std::shared_ptr<SliceRouteInfo> sri = getSliceRouteInfo(tds);
203         if (sri != nullptr) {
204             sri->addUsedUid(uid);
205         }
206     }
207 
removeUsedUid(int uid,const TrafficDescriptorsInfo & tds)208     void removeUsedUid(int uid, const TrafficDescriptorsInfo& tds)
209     {
210         std::shared_ptr<SliceRouteInfo> sri = getSliceRouteInfo(tds);
211         if (sri != nullptr) {
212             sri->removeUsedUid(uid);
213         }
214     }
215 
isInUsedUids(int uid,const TrafficDescriptorsInfo & tds)216     bool isInUsedUids(int uid, const TrafficDescriptorsInfo& tds)
217     {
218         std::shared_ptr<SliceRouteInfo> sri = getSliceRouteInfo(tds);
219         if (sri != nullptr) {
220             std::vector<int> uids = sri->getUsedUids();
221             return (std::find(uids.begin(), uids.end(), uid) != uids.end());
222         }
223         return false;
224     }
225 
isUsedUidEmpty(const TrafficDescriptorsInfo & tds)226     bool isUsedUidEmpty(const TrafficDescriptorsInfo& tds) const
227     {
228         std::shared_ptr<SliceRouteInfo> sri = getSliceRouteInfo(tds);
229         if (sri != nullptr) {
230             return true;
231         }
232         return sri->getUsedUids().empty();
233     }
234 
addUsedUids(const std::set<int> & uids,const TrafficDescriptorsInfo & tds)235     void addUsedUids(const std::set<int>& uids, const TrafficDescriptorsInfo& tds)
236     {
237         std::shared_ptr<SliceRouteInfo> sri = getSliceRouteInfo(tds);
238         if (sri != nullptr && !uids.empty()) {
239             for (const auto& uid : uids) {
240                 sri->addUsedUid(uid);
241             }
242         }
243     }
244 
getUids(const TrafficDescriptorsInfo & tds)245     std::vector<int> getUids(const TrafficDescriptorsInfo& tds) const
246     {
247         std::shared_ptr<SliceRouteInfo> sri = getSliceRouteInfo(tds);
248         if (sri != nullptr) {
249             return sri->getUids();
250         }
251         return std::vector<int>();
252     }
253 
addUid(int uid,const TrafficDescriptorsInfo & tds)254     void addUid(int uid, const TrafficDescriptorsInfo& tds)
255     {
256         std::shared_ptr<SliceRouteInfo> sri = getSliceRouteInfo(tds);
257         if (sri != nullptr) {
258             sri->addUid(uid);
259         }
260     }
261 
addUids(const std::set<int> & uids,const TrafficDescriptorsInfo & tds)262     void addUids(const std::set<int>& uids, const TrafficDescriptorsInfo& tds)
263     {
264         std::shared_ptr<SliceRouteInfo> sri = getSliceRouteInfo(tds);
265         if (sri != nullptr && !uids.empty()) {
266             for (const auto& uid : uids) {
267                 sri->addUid(uid);
268             }
269         }
270     }
271 
removeUid(int uid,const TrafficDescriptorsInfo & tds)272     void removeUid(int uid, const TrafficDescriptorsInfo& tds)
273     {
274         std::shared_ptr<SliceRouteInfo> sri = getSliceRouteInfo(tds);
275         if (sri != nullptr) {
276             sri->removeUid(uid);
277         }
278     }
279 
replaceUids(const TrafficDescriptorsInfo & tds,const std::set<int> & uids)280     void replaceUids(const TrafficDescriptorsInfo& tds, const std::set<int>& uids)
281     {
282         std::shared_ptr<SliceRouteInfo> sri = getSliceRouteInfo(tds);
283         if (sri != nullptr && !sri->getUids().empty()) {
284             sri->setUids(uids);
285         }
286     }
287 
getFqdnIps(const TrafficDescriptorsInfo & tds)288     std::shared_ptr<FqdnIps> getFqdnIps(const TrafficDescriptorsInfo& tds) const
289     {
290         std::shared_ptr<SliceRouteInfo> sri = getSliceRouteInfo(tds);
291         if (sri != nullptr) {
292             return sri->getFqdnIps();
293         }
294         return {};
295     }
296 
setFqdnIps(const FqdnIps & fqdnIps,const TrafficDescriptorsInfo & tds)297     void setFqdnIps(const FqdnIps& fqdnIps, const TrafficDescriptorsInfo& tds)
298     {
299         std::shared_ptr<SliceRouteInfo> sri = getSliceRouteInfo(tds);
300         if (sri != nullptr) {
301             sri->setFqdnIps(fqdnIps);
302         }
303     }
304 
getWaittingFqdnIps(const TrafficDescriptorsInfo & tds)305     std::vector<FqdnIps> getWaittingFqdnIps(const TrafficDescriptorsInfo& tds) const
306     {
307         std::shared_ptr<SliceRouteInfo> sri = getSliceRouteInfo(tds);
308         if (sri != nullptr) {
309             return sri->getWaittingFqdnIps();
310         }
311         return std::vector<FqdnIps>();
312     }
313 
setWaittingFqdnIps(const std::vector<FqdnIps> & waittingFqdnIps,const TrafficDescriptorsInfo & tds)314     void setWaittingFqdnIps(const std::vector<FqdnIps>& waittingFqdnIps, const TrafficDescriptorsInfo& tds)
315     {
316         std::shared_ptr<SliceRouteInfo> sri = getSliceRouteInfo(tds);
317         if (sri != nullptr) {
318             sri->setWaittingFqdnIps(waittingFqdnIps);
319         }
320     }
321 
cacheTrafficDescriptors(const TrafficDescriptorsInfo & tds)322     void cacheTrafficDescriptors(const TrafficDescriptorsInfo& tds)
323     {
324         NETMGR_EXT_LOG_E("cacheTrafficDescriptors UrspPrecedence = %{public}d, AppIds = %{public}s",
325             tds.getUrspPrecedence(), tds.getAppIds().c_str());
326 
327         SliceRouteInfo sliceRouteInfo;
328         mSliceRouteInfos[tds] = sliceRouteInfo;
329     }
330 
setTempTrafficDescriptors(const TrafficDescriptorsInfo & tds)331     void setTempTrafficDescriptors(const TrafficDescriptorsInfo& tds)
332     {
333         mTempTrafficDescriptors = std::make_shared<TrafficDescriptorsInfo>(tds);
334     }
335 
getTempTrafficDescriptors()336     std::shared_ptr<TrafficDescriptorsInfo> getTempTrafficDescriptors() const
337     {
338         return mTempTrafficDescriptors;
339     }
340 
getSliceRouteInfo(const TrafficDescriptorsInfo & tds)341     std::shared_ptr<SliceRouteInfo> getSliceRouteInfo(const TrafficDescriptorsInfo& tds) const
342     {
343         if (!tds.isUidRouteBindType()) {
344             return nullptr;
345         }
346         auto it = mSliceRouteInfos.find(tds);
347         if (it != mSliceRouteInfos.end()) {
348             return std::make_shared<SliceRouteInfo>(it->second);
349         } else {
350             return nullptr;
351         }
352     }
353 
getTrafficDescriptorsInfos()354     std::vector<TrafficDescriptorsInfo> getTrafficDescriptorsInfos() const
355     {
356         std::vector<TrafficDescriptorsInfo> trafficDescriptorsInfos;
357         for (auto iter = mSliceRouteInfos.begin(); iter != mSliceRouteInfos.end(); iter++) {
358             trafficDescriptorsInfos.push_back(iter->first);
359         }
360         return trafficDescriptorsInfos;
361     }
362 
getSliceRouteInfos()363     std::map<TrafficDescriptorsInfo, SliceRouteInfo> getSliceRouteInfos() const
364     {
365         return mSliceRouteInfos;
366     }
367 
isUidRouteBindType(const std::shared_ptr<TrafficDescriptorsInfo> & tds)368     bool isUidRouteBindType(const std::shared_ptr<TrafficDescriptorsInfo>& tds) const
369     {
370         if (tds == nullptr) {
371             return false;
372         }
373         return tds->isUidRouteBindType();
374     }
375 
clearSliceRouteInfos()376     void clearSliceRouteInfos()
377     {
378         mSliceRouteInfos.clear();
379     }
380 
getSignedUids(const TrafficDescriptorsInfo & tds)381     std::vector<int> getSignedUids(const TrafficDescriptorsInfo& tds) const
382     {
383         std::shared_ptr<SliceRouteInfo> sri = getSliceRouteInfo(tds);
384         if (sri == nullptr) {
385             return sri->getSignedUids();
386         }
387         return std::vector<int>();
388     }
389 
addSignedUid(int uid,const TrafficDescriptorsInfo & tds)390     void addSignedUid(int uid, const TrafficDescriptorsInfo& tds)
391     {
392         std::shared_ptr<SliceRouteInfo> sri = getSliceRouteInfo(tds);
393         if (sri != nullptr) {
394             sri->addSignedUid(uid);
395         }
396     }
397 
removeSignedUid(int uid,const TrafficDescriptorsInfo & tds)398     void removeSignedUid(int uid, const TrafficDescriptorsInfo& tds)
399     {
400         std::shared_ptr<SliceRouteInfo> sri = getSliceRouteInfo(tds);
401         if (sri != nullptr) {
402             sri->removeSignedUid(uid);
403         }
404     }
405 private:
406     int mNetId = INVALID_NET_ID;
407     int mNetworkCapability;
408     sptr<NetConnCallback> mNetworkCallback;
409     sptr<NetSpecifier> mNetworkRequest;
410     std::shared_ptr<TrafficDescriptorsInfo> mTempTrafficDescriptors;
411     std::shared_ptr<RouteSelectionDescriptorInfo> mRouteSelectionDescriptor;
412     std::map<int, sptr<NetSpecifier>> mNetworkRequests;
413     std::map<TrafficDescriptorsInfo, SliceRouteInfo> mSliceRouteInfos;
414 };
415 
416 const inline int NetworkSliceInfo::INVALID_NET_ID = -1;
417 const inline std::string NetworkSliceInfo::TAG = "NetworkSliceInfo";
418 
419 } // namespace NetManagerStandard
420 } // namespace OHOS
421 
422 #endif  // NETWORKSLCIEINFO_H
423