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