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