1 /*
2  * Copyright (C) 2024 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_CONFIG_CENTER_H
17 #define OHOS_WIFI_CONFIG_CENTER_H
18 
19 #include <atomic>
20 #include <chrono>
21 #include <map>
22 #include <memory>
23 #include <string>
24 #include <vector>
25 #include "wifi_internal_msg.h"
26 #include "wifi_settings.h"
27 #include "wifi_scan_config.h"
28 #ifndef STA_INSTANCE_MAX_NUM
29 #define STA_INSTANCE_MAX_NUM 2
30 #endif
31 #define SOFT_BUS_SERVICE_UID 1024
32 #define CAST_ENGINE_SERVICE_UID 5526
33 #define MIRACAST_SERVICE_UID 5529
34 #define MIRACAST_SERVICE_SA_ID 5527
35 #define SHARE_SERVICE_UID 5520
36 #define MOUSE_CROSS_SERVICE_UID 6699
37 namespace OHOS {
38 namespace Wifi {
39 using ChannelsTable = std::map<BandType, std::vector<int32_t>>;
40 
41 class WifiConfigCenter {
42 public:
43     static WifiConfigCenter &GetInstance();
44     ~WifiConfigCenter();
45 
46     int Init();
47 
48     std::unique_ptr<WifiScanConfig>& GetWifiScanConfig();
49 
50     void SetWifiSelfcureReset(const bool isReset);
51 
52     bool GetWifiSelfcureReset() const;
53 
54     void SetWifiSelfcureResetEntered(const bool isReset);
55 
56     bool GetWifiSelfcureResetEntered() const;
57 
58     void SetLastNetworkId(const int networkId);
59 
60     int GetLastNetworkId() const;
61 
62     void SetSelectedCandidateNetworkId(const int networkId);
63 
64     int GetSelectedCandidateNetworkId() const;
65 
66     void SetWifiAllowSemiActive(bool isAllowed);
67 
68     bool GetWifiAllowSemiActive() const;
69 
70     void SetWifiStopState(bool state);
71 
72     bool GetWifiStopState() const;
73 
74     void SetStaIfaceName(const std::string &ifaceName, int instId = 0);
75 
76     std::string GetStaIfaceName(int instId = 0);
77 
78     int GetWifiState(int instId = 0);
79 
80     int SetWifiState(int state, int instId = 0);
81 
82     WifiDetailState GetWifiDetailState(int instId = 0);
83 
84     int SetWifiDetailState(WifiDetailState state, int instId);
85 
86     WifiOprMidState GetWifiMidState(int instId = 0);
87 
88     bool SetWifiMidState(WifiOprMidState expState, WifiOprMidState state, int instId = 0);
89 
90     void SetWifiMidState(WifiOprMidState state, int instId = 0);
91 
92     void SetWifiStaCloseTime(int instId = 0);
93 
94     double GetWifiStaInterval(int instId = 0);
95 
96     bool GetWifiConnectedMode(int instId = 0);
97 
98     void SetWifiConnectedMode(bool isContainerConnected, int instId = 0);
99 
100     int SetChangeDeviceConfig(ConfigChange value, const WifiDeviceConfig &config);
101 
102     bool GetChangeDeviceConfig(ConfigChange& value, WifiDeviceConfig &config);
103 
104     int GetIpInfo(IpInfo &info, int instId = 0);
105 
106     int SaveIpInfo(const IpInfo &info, int instId = 0);
107 
108     int GetIpv6Info(IpV6Info &info, int instId = 0);
109 
110     int SaveIpV6Info(const IpV6Info &info, int instId = 0);
111 
112     std::map<int, WifiLinkedInfo> GetAllWifiLinkedInfo();
113 
114     int GetLinkedInfo(WifiLinkedInfo &info, int instId = 0);
115 
116     int SaveLinkedInfo(const WifiLinkedInfo &info, int instId = 0);
117 
118     int SetMacAddress(const std::string &macAddress, int instId = 0);
119 
120     int GetMacAddress(std::string &macAddress, int instId = 0);
121 
122     void SetUserLastSelectedNetworkId(int networkId, int instId = 0);
123 
124     int GetUserLastSelectedNetworkId(int instId = 0);
125 
126     time_t GetUserLastSelectedNetworkTimeVal(int instId = 0);
127 
128     std::string GetConnectTimeoutBssid(int instId = 0);
129 
130     int SetConnectTimeoutBssid(std::string &bssid, int instId = 0);
131 
132     void SaveDisconnectedReason(DisconnectedReason discReason, int instId = 0);
133 
134     int GetDisconnectedReason(DisconnectedReason &discReason, int instId = 0);
135 
136     void InsertWifiCategoryBlackListCache(int blacklistType, const std::string currentBssid,
137         const WifiCategoryBlackListInfo wifiBlackListInfo);
138 
139     void RemoveWifiCategoryBlackListCache(int blacklistType, const std::string bssid);
140 
141     int GetWifiCategoryBlackListCache(int blacklistType,
142         std::map<std::string, WifiCategoryBlackListInfo> &blackListCache);
143 
144     void UpdateWifiConnectFailListCache(int blacklistType, const std::string bssid,
145         const WifiCategoryConnectFailInfo wifi7ConnectFailInfo);
146 
147     void RemoveWifiConnectFailListCache(const std::string bssid);
148 
149     int GetWifiConnectFailListCache(
150         std::map<std::string, WifiCategoryConnectFailInfo> &connectFailCache);
151 
152     bool EnableNetwork(int networkId, bool disableOthers, int instId = 0);
153 
154     WifiOprMidState GetScanMidState(int instId = 0);
155 
156     bool SetScanMidState(WifiOprMidState expState, WifiOprMidState state, int instId = 0);
157 
158     void SetScanMidState(WifiOprMidState state, int instId = 0);
159 
160     WifiOprMidState GetWifiScanOnlyMidState(int instId = 0);
161 
162     bool SetWifiScanOnlyMidState(WifiOprMidState expState, WifiOprMidState state, int instId = 0);
163 
164     void SetWifiScanOnlyMidState(WifiOprMidState state, int instId = 0);
165 
166     int SetWifiLinkedStandardAndMaxSpeed(WifiLinkedInfo &linkInfo);
167 
168     bool CheckScanOnlyAvailable(int instId = 0);
169 
170     std::string GetConnectedBssid(int instId = 0);
171 
172     void SetSoftapToggledState(bool state);
173 
174     bool GetSoftapToggledState() const;
175 
176     int SetHotspotIdleTimeout(int time);
177 
178     int GetHotspotIdleTimeout() const;
179 
180     void SetApIfaceName(const std::string &ifaceName);
181 
182     std::string GetApIfaceName();
183 
184     WifiOprMidState GetApMidState(int id = 0);
185 
186     bool SetApMidState(WifiOprMidState expState, WifiOprMidState state, int id = 0);
187 
188     void SetApMidState(WifiOprMidState state, int id = 0);
189 
190     int GetHotspotState(int id = 0);
191 
192     int SetHotspotState(int state, int id = 0);
193 
194     int SetPowerModel(const PowerModel& model, int id = 0);
195 
196     int GetPowerModel(PowerModel& model, int id = 0);
197 
198     int GetStationList(std::vector<StationInfo> &results, int id = 0);
199 
200     int ManageStation(const StationInfo &info, int mode, int id = 0);
201 
202     int ClearStationList(int id = 0);
203 
204     void SetP2pIfaceName(const std::string &ifaceName);
205 
206     std::string GetP2pIfaceName();
207 
208     int SetHid2dUpperScene(int uid, const Hid2dUpperScene &scene);
209 
210     int GetHid2dUpperScene(int uid, Hid2dUpperScene &scene);
211 
212     void ClearLocalHid2dInfo(int uid = 0);
213 
214     int SetP2pEnhanceState(int state);
215 
216     int GetP2pEnhanceState();
217 
218     WifiOprMidState GetP2pMidState();
219 
220     bool SetP2pMidState(WifiOprMidState expState, WifiOprMidState state);
221 
222     void SetP2pMidState(WifiOprMidState state);
223 
224     int SetP2pState(int state);
225 
226     int GetP2pState();
227 
228     int SetP2pDiscoverState(int state);
229 
230     int GetP2pDiscoverState();
231 
232     int SetP2pBusinessType(const P2pBusinessType &type);
233 
234     int GetP2pBusinessType(P2pBusinessType &type);
235 
236     int SaveP2pCreatorUid(int uid);
237 
238     int GetP2pCreatorUid();
239 
240     void SetExplicitGroup(bool isExplicit);
241 
242     bool IsExplicitGroup(void);
243 
244     int SaveP2pInfo(WifiP2pLinkedInfo &linkedInfo);
245 
246     int GetP2pInfo(WifiP2pLinkedInfo &linkedInfo);
247 
248     void SetCurrentP2pGroupInfo(const WifiP2pGroupInfo &group);
249 
250     WifiP2pGroupInfo GetCurrentP2pGroupInfo();
251 
252     void SetCoexSupport(bool isSupport);
253 
254     bool GetCoexSupport() const;
255 
256     void SetScreenState(const int &state);
257 
258     int GetScreenState() const;
259 
260     void SetThermalLevel(const int &level);
261 
262     int GetThermalLevel() const;
263 
264     void SetPowerIdelState(const int &state);
265 
266     int GetPowerIdelState() const;
267 
268     void SetGnssFixState(const int &state);
269 
270     int GetGnssFixState() const;
271 
272     void SetScanGenieState(const int &state);
273 
274     int GetScanGenieState() const;
275 
276     bool SetWifiStateOnAirplaneChanged(const int &state);
277 
278     int GetAirplaneModeState() const;
279 
280     int GetWifiToggledEnable(int id = 0);
281 
282     void SetWifiToggledState(int state, int id = 0);
283 
284     void SetPowerSavingModeState(const int &state);
285 
286     int GetPowerSavingModeState() const;
287 
288     void SetFreezeModeState(int state);
289 
290     int GetFreezeModeState() const;
291 
292     void SetNoChargerPlugModeState(int state);
293 
294     int GetNoChargerPlugModeState() const;
295 
296     void SetThreadStatusFlag(bool state);
297 
298     bool GetThreadStatusFlag(void) const;
299 
300     uint64_t GetThreadStartTime(void) const;
301 
302     bool StoreWifiMacAddrPairInfo(WifiMacAddrInfoType type, const std::string &realMacAddr,
303         const std::string &randomAddr);
304 
305     std::string GetRandomMacAddr(WifiMacAddrInfoType type, std::string bssid);
306 
307     std::string GetMacAddrPairs(WifiMacAddrInfoType type, const WifiMacAddrInfo &macAddrInfo);
308 
309     void ClearMacAddrPairs(WifiMacAddrInfoType type);
310 
311     std::set<int> GetAllWifiLinkedNetworkId();
312 
313     void SetPersistWifiState(int state, int instId);
314 
315     int GetPersistWifiState(int instId);
316 
317     bool HasWifiActive();
318 
319     void RemoveMacAddrPairInfo(WifiMacAddrInfoType type, std::string bssid, int bssidType);
320 
321     void UpdateLinkedInfo(int instId = 0);
322 
323     int SetHotspotMacConfig(const HotspotMacConfig &config, int id = 0);
324 
325     int GetHotspotMacConfig(HotspotMacConfig &config, int id = 0);
326 private:
327     WifiConfigCenter();
328     std::string GetPairMacAddress(std::map<WifiMacAddrInfo, std::string>& macAddrInfoMap,
329         const WifiMacAddrInfo &macAddrInfo);
330     WifiMacAddrErrCode InsertMacAddrPairs(std::map<WifiMacAddrInfo, std::string>& macAddrInfoMap,
331         const WifiMacAddrInfo &macAddrInfo, std::string& randomMacAddr);
332     void DelMacAddrPairs(std::map<WifiMacAddrInfo, std::string>& macAddrInfoMap, const WifiMacAddrInfo &macAddrInfo);
333     WifiMacAddrErrCode AddMacAddrPairs(WifiMacAddrInfoType type, const WifiMacAddrInfo &macAddrInfo,
334         std::string randomMacAddr);
335     int RemoveMacAddrPairs(WifiMacAddrInfoType type, const WifiMacAddrInfo &macAddrInfo);
336 
337 private:
338     // STA
339     std::mutex mStaMutex;
340     std::atomic<bool> mWifiSelfcureReset {false};
341     std::atomic<bool> mWifiSelfcureResetEntered {false};
342     std::atomic<int> mLastNetworkId {INVALID_NETWORK_ID};
343     std::atomic<int> mSelectedCandidateNetworkId {INVALID_NETWORK_ID};
344     std::atomic<bool> mWifiAllowSemiActive {false};
345     std::atomic<bool> mWifiStoping {false};
346     std::vector<std::string> mStaIfaceName = {"wlan0", "wlan1"};
347     std::map<int, std::atomic<int>> mWifiState;
348     std::map<int, WifiDetailState> mWifiDetailState;
349     std::map<int, std::atomic<WifiOprMidState>> mStaMidState;
350     std::map<int, std::chrono::steady_clock::time_point> mWifiCloseTime;
351     std::map<int, std::atomic<bool>> mIsAncoConnected;
352     std::pair<int, WifiDeviceConfig> mLastRemoveDeviceConfig;
353     std::map<int, IpInfo> mWifiIpInfo;
354     std::map<int, IpV6Info> mWifiIpV6Info;
355     std::map<int, WifiLinkedInfo> mWifiLinkedInfo;
356     std::map<int, std::string> mMacAddress;
357     std::map<int, int> mLastSelectedNetworkId;
358     std::map<int, time_t> mLastSelectedTimeVal;
359     std::map<int, std::pair<std::string, int>> mBssidToTimeoutTime;
360     std::map<int, DisconnectedReason> mLastDiscReason;
361     std::map<int, std::map<std::string, WifiCategoryBlackListInfo>> mWifiCategoryBlackListCache;
362     std::map<std::string, WifiCategoryConnectFailInfo> mWifiConnectFailCache;
363 
364     // SCAN
365     std::mutex mScanMutex;
366     std::map<int, std::atomic<WifiOprMidState>> mScanMidState;
367     std::map<int, std::atomic<WifiOprMidState>> mScanOnlyMidState;
368     std::unique_ptr<WifiScanConfig> wifiScanConfig = nullptr;
369 
370     // AP
371     std::mutex mApMutex;
372     std::atomic<bool> mSoftapToggled {false};
373     std::atomic<int> mHotspotIdleTimeout {HOTSPOT_IDLE_TIMEOUT_INTERVAL_MS};
374     std::string mApIfaceName {"wlan0"};
375     std::map<int, std::atomic<WifiOprMidState>> mApMidState;
376     std::map <int, std::atomic<int>> mHotspotState;
377     std::map<int, PowerModel> powerModel;
378     std::map<std::string, StationInfo> mConnectStationInfo;
379     std::map<int, HotspotMacConfig> mHotspotMacConfig;
380 
381     // P2P
382     std::mutex mP2pMutex;
383 #ifdef HDI_CHIP_INTERFACE_SUPPORT
384     std::string mP2pIfaceName {"p2p0"};
385 #else
386     std::string mP2pIfaceName {"p2p-dev-wlan0"};
387 #endif
388     std::map<int, Hid2dUpperScene> mHid2dUpperScenePair;
389     std::atomic<WifiOprMidState> mP2pMidState {WifiOprMidState::CLOSED};
390     std::atomic<int> mP2pState {static_cast<int>(P2pState::P2P_STATE_CLOSED)};
391     std::atomic<int> mP2pEnhanceState {0};
392     std::atomic<int> mP2pDiscoverState {0};
393     std::atomic<P2pBusinessType> mP2pBusinessType {P2pBusinessType::INVALID};
394     std::atomic<int> mP2pCreatorUid {-1};
395     std::atomic<bool> mExplicitGroup {false};
396     WifiP2pLinkedInfo mWifiP2pInfo;
397     WifiP2pGroupInfo m_P2pGroupInfo;
398 
399     // COMMON
400     std::atomic<bool> mIsSupportCoex {false};
401     std::atomic<int> mScreenState {MODE_STATE_DEFAULT};
402     std::atomic<int> mThermalLevel {static_cast<int>(ThermalLevel::NORMAL)};
403     std::atomic<int> mPowerIdelState {MODE_STATE_CLOSE};
404     std::atomic<int> mGnssFixState {MODE_STATE_CLOSE};
405     std::atomic<int> mScanGenieState {MODE_STATE_OPEN};
406     std::atomic<int> mAirplaneModeState {MODE_STATE_CLOSE};
407     std::vector<int> mPersistWifiState {std::vector<int>(2, WIFI_STATE_DISABLED)};
408     std::atomic<int> mPowerSavingModeState {MODE_STATE_CLOSE};
409     std::atomic<int> mFreezeModeState {MODE_STATE_CLOSE};
410     std::atomic<int> mNoChargerPlugModeState {MODE_STATE_CLOSE};
411     std::atomic<bool> mThreadStatusFlag_ {false};
412     std::atomic<uint64_t> mThreadStartTime {0};
413     std::mutex mMacAddrPairMutex;
414     std::map<WifiMacAddrInfo, std::string> mWifiScanMacAddrPair;
415     std::map<WifiMacAddrInfo, std::string> mHotspotMacAddrPair;
416     std::map<WifiMacAddrInfo, std::string> mP2pDeviceMacAddrPair;
417     std::map<WifiMacAddrInfo, std::string> mP2pGroupsInfoMacAddrPair;
418     std::map<WifiMacAddrInfo, std::string> mP2pCurrentgroupMacAddrPair;
419 };
420 } // namespace Wifi
421 } // namespace OHOS
422 #endif
423