• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 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 #include "ap_stations_manager.h"
16 #include <unistd.h>
17 #include "ap_service.h"
18 #include "wifi_log.h"
19 #include "wifi_config_center.h"
20 #include "wifi_ap_hal_interface.h"
21 #include "ap_state_machine.h"
22 #include "wifi_logger.h"
23 #include "wifi_common_util.h"
24 
25 DEFINE_WIFILOG_HOTSPOT_LABEL("WifiApStationsManager");
26 
27 namespace OHOS {
28 namespace Wifi {
ApStationsManager(int id)29 ApStationsManager::ApStationsManager(int id) : m_id(id)
30 {}
31 
~ApStationsManager()32 ApStationsManager::~ApStationsManager()
33 {}
34 
AddBlockList(const StationInfo & staInfo) const35 bool ApStationsManager::AddBlockList(const StationInfo &staInfo) const
36 {
37     if (WifiApHalInterface::GetInstance().AddBlockByMac(staInfo.bssid, m_id) != WifiErrorNo::WIFI_HAL_OPT_OK) {
38         WIFI_LOGE("Instance is %{public}d failed to add block.", m_id);
39         return false;
40     }
41     return true;
42 }
43 
DelBlockList(const StationInfo & staInfo) const44 bool ApStationsManager::DelBlockList(const StationInfo &staInfo) const
45 {
46     if (WifiApHalInterface::GetInstance().DelBlockByMac(staInfo.bssid, m_id) != WifiErrorNo::WIFI_HAL_OPT_OK) {
47         WIFI_LOGE("Instance is %{public}d failed to del block.", m_id);
48         return false;
49     }
50     return true;
51 }
52 
AddAssociationStation(const StationInfo & staInfo) const53 bool ApStationsManager::AddAssociationStation(const StationInfo &staInfo) const
54 {
55     if (WifiConfigCenter::GetInstance().ManageStation(staInfo, MODE_ADD, m_id)) {
56         WIFI_LOGE("Instance is %{public}d failed add station.", m_id);
57         return false;
58     }
59     return true;
60 }
61 
DelAssociationStation(const StationInfo & staInfo) const62 bool ApStationsManager::DelAssociationStation(const StationInfo &staInfo) const
63 {
64     if (WifiConfigCenter::GetInstance().ManageStation(staInfo, MODE_DEL, m_id)) {
65         WIFI_LOGE("Instance is %{public}d failed to del station.", m_id);
66         return false;
67     }
68     return true;
69 }
70 
EnableAllBlockList() const71 bool ApStationsManager::EnableAllBlockList() const
72 {
73     std::vector<StationInfo> results;
74     if (WifiSettings::GetInstance().GetBlockList(results, m_id)) {
75         WIFI_LOGE("Instance is %{public}d failed to get blocklist.", m_id);
76         return false;
77     }
78     std::string mac;
79     bool ret = true;
80     for (std::vector<StationInfo>::iterator iter = results.begin(); iter != results.end(); iter++) {
81         if (WifiApHalInterface::GetInstance().AddBlockByMac(iter->bssid, m_id) != WifiErrorNo::WIFI_HAL_OPT_OK) {
82             WIFI_LOGE("Instance is %{public}d failed to add block bssid is:%{public}s.", m_id,
83                 MacAnonymize(iter->bssid).c_str());
84             ret = false;
85         }
86     }
87     return ret;
88 }
89 
StationLeave(const std::string & mac) const90 void ApStationsManager::StationLeave(const std::string &mac) const
91 {
92     StationInfo staInfo;
93     std::vector<StationInfo> results;
94     if (WifiConfigCenter::GetInstance().GetStationList(results, m_id)) {
95         WIFI_LOGE("Instance is %{public}d failed to GetStationList.", m_id);
96         return;
97     }
98     auto it = results.begin();
99     for (; it != results.end(); ++it) {
100         if (it->bssid == mac) {
101             staInfo = *it;
102             if (!DelAssociationStation(staInfo)) {
103                 WIFI_LOGE("Instance is %{public}d del AssociationStation failed.", m_id);
104                 return;
105             }
106             break;
107         }
108     }
109     if (m_stationChangeCallback) {
110         m_stationChangeCallback(staInfo, ApStatemachineEvent::CMD_STATION_LEAVE);
111     }
112     return;
113 }
114 
StationJoin(const StationInfo & staInfo) const115 void ApStationsManager::StationJoin(const StationInfo &staInfo) const
116 {
117     StationInfo staInfoTemp = staInfo;
118     std::vector<StationInfo> results;
119     if (WifiConfigCenter::GetInstance().GetStationList(results, m_id)) {
120         WIFI_LOGE("Instance is %{public}d failed to GetStationList.", m_id);
121         return;
122     }
123     auto it = results.begin();
124     for (; it != results.end(); ++it) {
125         if (it->bssid == staInfo.bssid) {
126             if (staInfo.deviceName == OHOS::Wifi::GETTING_INFO && staInfo.ipAddr == OHOS::Wifi::GETTING_INFO) {
127                 staInfoTemp = *it;
128             }
129             break;
130         }
131     }
132 
133     if (!AddAssociationStation(staInfoTemp)) {
134         WIFI_LOGE("Instance is %{public}d addAssociationStation failed.", m_id);
135         return;
136     }
137 
138     if (it == results.end() || it->ipAddr != staInfo.ipAddr) {
139         if (m_stationChangeCallback) {
140             m_stationChangeCallback(staInfoTemp, ApStatemachineEvent::CMD_STATION_JOIN);
141         }
142     }
143     return;
144 }
145 
DisConnectStation(const StationInfo & staInfo) const146 bool ApStationsManager::DisConnectStation(const StationInfo &staInfo) const
147 {
148     std::string mac = staInfo.bssid;
149     int ret = static_cast<int>(WifiApHalInterface::GetInstance().DisconnectStaByMac(mac, m_id));
150     if (ret != WifiErrorNo::WIFI_HAL_OPT_OK) {
151         WIFI_LOGE("Instance is %{public}d failed to DisConnectStation staInfo bssid:%{public}s,address:%{public}s, name:%{private}s.",
152             m_id,
153             MacAnonymize(staInfo.bssid).c_str(),
154             IpAnonymize(staInfo.ipAddr).c_str(),
155             staInfo.deviceName.c_str());
156         return false;
157     }
158     return true;
159 }
160 
GetAllConnectedStations() const161 std::vector<std::string> ApStationsManager::GetAllConnectedStations() const
162 {
163     std::vector<std::string> staMacList;
164     if (WifiApHalInterface::GetInstance().GetStationList(staMacList, m_id) == WifiErrorNo::WIFI_HAL_OPT_OK) {
165         for (size_t i = 0; i < staMacList.size(); ++i) {
166             WIFI_LOGD("Instance is %{public}d staMacList[%{public}zu]:%{private}s.", m_id, i, staMacList[i].c_str());
167         }
168     }
169     return staMacList;
170 }
171 
RegisterEventHandler(std::function<void (const StationInfo &,ApStatemachineEvent)> callback)172 void ApStationsManager::RegisterEventHandler(std::function<void(const StationInfo &, ApStatemachineEvent)> callback)
173 {
174     m_stationChangeCallback = callback;
175 }
176 }  // namespace Wifi
177 }  // namespace OHOS