• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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