1 /* 2 * Copyright (C) 2021-2023 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 OHOS_WIFI_NETWORK_SELECTION_H 17 #define OHOS_WIFI_NETWORK_SELECTION_H 18 #include <functional> 19 #include <memory> 20 #include <set> 21 #include "wifi_msg.h" 22 #include "inter_scan_info.h" 23 24 namespace OHOS::Wifi { 25 namespace NetworkSelection { 26 enum FiltedReason { 27 UNKNOW = 0, 28 HIDDEN_NETWORK, 29 OPEN_NETWORK, 30 NOT_OPEN_NETWORK, 31 WEAK_ALGORITHM_WEP_SECURITY, 32 WEAK_ALGORITHM_WPA_SECURITY, 33 HAS_NETWORK_HISTORY, 34 PORTAL_NETWORK, 35 NOT_PORTAL_NETWORK, 36 OWE_NETWORK, 37 UNRECOVERABLE_NETWORK, 38 NETWORK_STATUS_DISABLE, 39 UNEXPECTED_NETWORK_BY_USER, 40 NO_INTERNET, 41 HAS_INTERNET, 42 NETWORK_ID_INVALID, 43 NOT_SYSTEM_NETWORK, 44 TIME_INVALID, 45 EPHEMERAL_NETWORK, 46 PASSPOINT_NETWORK, 47 POOR_SIGNAL, 48 TIMEOUT_AND_NEED_RECHECK, 49 NOT_ALLOW_AUTO_CONNECT, 50 }; 51 52 struct FiltedReasonComparator { operatorFiltedReasonComparator53 bool operator()(const FiltedReason& lhs, const FiltedReason& rhs) const 54 { 55 return static_cast<int>(lhs) < static_cast<int>(rhs); 56 } 57 }; 58 59 struct NetworkCandidate { 60 const InterScanInfo &interScanInfo; 61 WifiDeviceConfig wifiDeviceConfig; NetworkCandidateNetworkCandidate62 explicit NetworkCandidate(const InterScanInfo &interScanInfo) : interScanInfo(interScanInfo), wifiDeviceConfig() {} 63 std::map<std::string, std::set<FiltedReason, FiltedReasonComparator, std::allocator<FiltedReason>>> filtedReason; 64 std::string ToString(const std::string &filterName = "") const; 65 }; 66 67 struct ScoreResult { 68 double score; 69 std::string scorerName; 70 std::vector<ScoreResult> scoreDetails; ScoreResultScoreResult71 ScoreResult() : score(0) {} 72 std::string ToString() const; 73 }; 74 75 class IWifiFilter { 76 public: 77 virtual ~IWifiFilter() = default; 78 79 /** 80 * filter the candidate network 81 * @param networkCandidate candidate network. 82 * @return true if the candidate network satisfy the condition 83 */ 84 virtual bool DoFilter(NetworkCandidate &networkCandidate) final; 85 virtual std::string GetFilterMsg() = 0; 86 protected: 87 88 /** 89 * filter the candidate network 90 * @param networkCandidate candidate network. 91 * @return true if the candidate network satisfy the condition 92 */ 93 virtual bool Filter(NetworkCandidate &networkCandidate) = 0; 94 95 /** 96 * deal with the candidate network after filter 97 * @param networkCandidate candidate network. 98 * @param filterResult if the candidate network satisfy the condition 99 */ 100 virtual void AfterFilter(NetworkCandidate &networkCandidate, bool filterResult); 101 }; 102 103 class SimpleWifiFilter : public IWifiFilter { 104 public: 105 explicit SimpleWifiFilter(const std::string &networkSelectorFilterName); 106 ~SimpleWifiFilter() override; 107 std::string GetFilterMsg() final; 108 protected: 109 void AfterFilter(NetworkCandidate &networkCandidate, bool filterResult) final; 110 std::vector<NetworkCandidate *> filteredNetworkCandidates; 111 std::string filterName; 112 }; 113 114 class WifiFunctionFilterAdapter : public IWifiFilter { 115 public: 116 117 /** 118 * 119 * @param filter the point to filterFunction 120 * @param filterName the filterName 121 * @param reverse for default it should be filtered when the function return true, And it can be modified; 122 */ 123 WifiFunctionFilterAdapter(const std::function<bool(NetworkCandidate &)> &filter, 124 const std::string &filterName, 125 bool reverse = false); 126 ~WifiFunctionFilterAdapter() override; 127 std::string GetFilterMsg() override; 128 protected: 129 bool Filter(NetworkCandidate &networkCandidate) override; 130 std::function<bool(NetworkCandidate &)> targetFunction; 131 std::string filterName; 132 bool iSReverse; 133 }; 134 135 class CompositeWifiFilter : public IWifiFilter { 136 public: 137 /** 138 * Add Filter for composite network selector filter 139 * @param filter filter 140 */ 141 virtual void AddFilter(const std::shared_ptr<IWifiFilter> &filter); 142 ~CompositeWifiFilter() override; 143 protected: 144 std::vector<std::shared_ptr<IWifiFilter>> filters; 145 }; 146 147 class AndWifiFilter : public CompositeWifiFilter { 148 public: 149 ~AndWifiFilter() override; 150 bool Filter(NetworkCandidate &networkCandidate) override; 151 std::string GetFilterMsg() override; 152 }; 153 154 class OrWifiFilter : public CompositeWifiFilter { 155 public: 156 bool Filter(NetworkCandidate &networkCandidate) override; 157 ~OrWifiFilter() override; 158 std::string GetFilterMsg() override; 159 }; 160 161 class IWifiScorer { 162 public: 163 virtual ~IWifiScorer() = default; 164 virtual void DoScore(NetworkCandidate &networkCandidate, ScoreResult &scoreResult) = 0; 165 }; 166 167 class SimpleWifiScorer : public IWifiScorer { 168 public: 169 explicit SimpleWifiScorer(const std::string &scorerName); 170 ~SimpleWifiScorer() override; 171 void DoScore(NetworkCandidate &networkCandidate, ScoreResult &scoreResult) final; 172 protected: 173 virtual double Score(NetworkCandidate &networkCandidate) = 0; 174 std::string m_scoreName; 175 }; 176 177 class CompositeWifiScorer : public IWifiScorer { 178 public: 179 explicit CompositeWifiScorer(const std::string &scorerName); 180 ~CompositeWifiScorer() override; 181 void DoScore(NetworkCandidate &networkCandidate, ScoreResult &scoreResult) final; 182 void AddScorer(const std::shared_ptr<IWifiScorer> &scorer); 183 protected: 184 std::vector<std::shared_ptr<IWifiScorer>> scorers; 185 std::string m_scoreName; 186 }; 187 188 class WifiFunctionScorerAdapter : public SimpleWifiScorer { 189 public: 190 191 /** 192 * 193 * @param scorer the point to scorerFunction 194 * @param scorerName the scorerName 195 * @param reverse for default it should be filtered when the function return true, And it can be modified; 196 */ 197 WifiFunctionScorerAdapter(const std::function<double(NetworkCandidate &)> &scorer, 198 const std::string &scorerName); 199 ~WifiFunctionScorerAdapter() override; 200 protected: 201 virtual double Score(NetworkCandidate &networkCandidate) override; 202 std::function<double(NetworkCandidate &)> targetFunction; 203 std::string m_scoreName; 204 }; 205 206 class IWifiComparator { 207 public: 208 virtual ~IWifiComparator() = default; 209 210 /** 211 * GetBestCandidates 212 * 213 * @param candidates the candidate network before compare. 214 * @param selectedCandidates the best candidate network after compare. 215 */ 216 virtual void GetBestCandidates(const std::vector<NetworkCandidate *> &candidates, 217 std::vector<NetworkCandidate *> &selectedCandidates) = 0; 218 }; 219 220 class INetworkSelector { 221 public: 222 virtual ~INetworkSelector() = default; 223 224 /** 225 * the function to try nominator the candidate network. 226 * 227 * @param networkCandidate candidate network 228 * @return return true if the candidate network is nominated. 229 */ 230 virtual bool TryNominate(NetworkCandidate &networkCandidate) = 0; 231 232 /** 233 * the function to get best candidate networks. 234 * @param selectedNetworkCandidates the best candidate networks. 235 */ 236 virtual void GetBestCandidates(std::vector<NetworkCandidate *> &selectedNetworkCandidates) = 0; 237 238 /** 239 * transfer the info of network selector to json format string. 240 * @return 241 */ 242 virtual std::string GetNetworkSelectorMsg() = 0; 243 }; 244 245 class NetworkSelector : public INetworkSelector { 246 public: 247 explicit NetworkSelector(const std::string &networkSelectorName); 248 ~NetworkSelector() override; 249 /** 250 * the function to set comparator。 251 * 252 * @param networkSelectorComparator comparator 253 */ 254 virtual void SetWifiComparator(const std::shared_ptr<IWifiComparator> &networkSelectorComparator) final; 255 256 /** 257 * the function to set filter. 258 * 259 * @param networkSelectorFilter filter 260 */ 261 virtual void SetWifiFilter(const std::shared_ptr<IWifiFilter> &networkSelectorFilter) final; 262 bool TryNominate(NetworkCandidate &networkCandidate) final; 263 protected: 264 265 /** 266 * filter the candidate network 267 * 268 * @param networkCandidate candidate network 269 * @return true if the candidate network pass. 270 */ 271 virtual bool DoFilter(NetworkCandidate &networkCandidate) final; 272 273 /** 274 * get best candidate network by comparator. 275 * 276 * @param selectedNetworkCandidates the best candidate networks; 277 */ 278 virtual void GetBestCandidatesByComparator(std::vector<NetworkCandidate *> &selectedNetworkCandidates) final; 279 280 /** 281 * deal with the candidate network which pass the filter. 282 * 283 * @param networkCandidate candidate network 284 * @return true if the candidate network is added to networkCandidates. 285 */ 286 virtual bool Nominate(NetworkCandidate &networkCandidate) = 0; 287 288 std::vector<NetworkCandidate *> networkCandidates; 289 std::shared_ptr<IWifiComparator> comparator; 290 std::shared_ptr<IWifiFilter> filter; 291 const std::string m_networkSelectorName; 292 }; 293 294 class SimpleNetworkSelector : public NetworkSelector { 295 public: 296 explicit SimpleNetworkSelector(const std::string &networkSelectorName); 297 ~SimpleNetworkSelector() override; 298 std::string GetNetworkSelectorMsg() override; 299 void GetBestCandidates(std::vector<NetworkCandidate *> &selectedNetworkCandidates) final; 300 protected: 301 bool Nominate(NetworkCandidate &networkCandidate) override; 302 }; 303 304 class CompositeNetworkSelector : public NetworkSelector { 305 public: 306 explicit CompositeNetworkSelector(const std::string &networkSelectorName); 307 ~CompositeNetworkSelector() override; 308 /** 309 * Add subnetworkSelector for compositeNetworkSelector 310 * 311 * @param subNetworkSelector subNetworkSelector 312 */ 313 void AddSubNetworkSelector(const std::shared_ptr<INetworkSelector> &subNetworkSelector); 314 void GetBestCandidates(std::vector<NetworkCandidate *> &selectedNetworkCandidates) final; 315 std::string GetNetworkSelectorMsg() override; 316 protected: 317 /** 318 * deal with the candidate network before compare. 319 */ 320 virtual void GetCandidatesFromSubNetworkSelector() = 0; 321 std::vector<std::shared_ptr<INetworkSelector>> subNetworkSelectors; 322 }; 323 } 324 325 enum class FilterTag { 326 SAVED_NETWORK_TRACKER_FILTER_TAG, 327 HAS_INTERNET_NETWORK_SELECTOR_FILTER_TAG, 328 RECOVERY_NETWORK_SELECTOR_FILTER_TAG, 329 PORTAL_NETWORK_SELECTOR_FILTER_TAG, 330 IT_NETWORK_SELECTOR_FILTER_TAG, 331 }; 332 333 enum class TagType { 334 // The following is filter tag 335 NOT_P2P_ENHANCE_FREQ_AT_5G_FILTER_TAG, 336 // The following is the scorer tag 337 HAS_INTERNET_NETWORK_SELECTOR_SCORE_WIFI_CATEGORY_TAG, 338 }; 339 340 enum class CommonBuilderType { 341 FILTER_BUILDER, 342 SCORE_BUILDER, 343 }; 344 345 using FilterBuilder = std::function<void(NetworkSelection::CompositeWifiFilter &)>; 346 using ScoreBuilder = std::function<void(NetworkSelection::CompositeWifiScorer &)>; 347 348 struct CommonBuilder { CommonBuilderCommonBuilder349 CommonBuilder() 350 { 351 commonBuilderType = CommonBuilderType::FILTER_BUILDER; 352 } 353 CommonBuilderCommonBuilder354 CommonBuilder(const CommonBuilder &commonBuilder) 355 { 356 filterBuilder = commonBuilder.filterBuilder; 357 scoreBuilder = commonBuilder.scoreBuilder; 358 } 359 ~CommonBuilderCommonBuilder360 ~CommonBuilder() {} 361 362 const CommonBuilder &operator=(const CommonBuilder &commonBuilder) 363 { 364 filterBuilder = commonBuilder.filterBuilder; 365 scoreBuilder = commonBuilder.scoreBuilder; 366 return *this; 367 } IsEmptyCommonBuilder368 bool IsEmpty() const 369 { 370 if (!filterBuilder && commonBuilderType == CommonBuilderType::FILTER_BUILDER) { 371 return true; 372 } else if (!scoreBuilder && commonBuilderType == CommonBuilderType::SCORE_BUILDER) { 373 return true; 374 } 375 return false; 376 } 377 378 FilterBuilder filterBuilder; 379 ScoreBuilder scoreBuilder; 380 CommonBuilderType commonBuilderType; 381 }; 382 } 383 #endif 384