blob: 68c989d6a64a4b26fa9564511708ed8f4c127d91 [file] [log] [blame]
Roshan Pius3e2d6712016-10-06 13:16:23 -07001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Roshan Pius3e2d6712016-10-06 13:16:23 -070017#include <android-base/logging.h>
18
Roshan Pius907d4a22016-10-27 12:48:12 -070019#include "hidl_return_util.h"
Roshan Pius970f0312016-12-05 15:25:51 -080020#include "hidl_struct_util.h"
Roshan Pius907d4a22016-10-27 12:48:12 -070021#include "wifi_sta_iface.h"
Roshan Pius734fea02016-10-11 08:30:28 -070022#include "wifi_status_util.h"
Roshan Pius3e2d6712016-10-06 13:16:23 -070023
24namespace android {
25namespace hardware {
26namespace wifi {
Ahmed ElArabawyf501a982019-07-23 15:02:22 -070027namespace V1_4 {
Roshan Pius3e2d6712016-10-06 13:16:23 -070028namespace implementation {
Roshan Pius907d4a22016-10-27 12:48:12 -070029using hidl_return_util::validateAndCall;
Roshan Pius3e2d6712016-10-06 13:16:23 -070030
Roshan Pius6cedc972016-10-28 10:11:17 -070031WifiStaIface::WifiStaIface(
32 const std::string& ifname,
Roshan Pius99dab382019-02-14 07:57:10 -080033 const std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal,
34 const std::weak_ptr<iface_util::WifiIfaceUtil> iface_util)
35 : ifname_(ifname),
36 legacy_hal_(legacy_hal),
37 iface_util_(iface_util),
38 is_valid_(true) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070039 // Turn on DFS channel usage for STA iface.
40 legacy_hal::wifi_error legacy_status =
41 legacy_hal_.lock()->setDfsFlag(ifname_, true);
42 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
43 LOG(ERROR)
44 << "Failed to set DFS flag; DFS channels may be unavailable.";
45 }
Roshan Pius08d1df42017-04-19 23:11:07 -070046}
Roshan Pius3e2d6712016-10-06 13:16:23 -070047
48void WifiStaIface::invalidate() {
Roshan Piusabcf78f2017-10-06 16:30:38 -070049 legacy_hal_.reset();
50 event_cb_handler_.invalidate();
51 is_valid_ = false;
Roshan Pius3e2d6712016-10-06 13:16:23 -070052}
53
Roshan Piusabcf78f2017-10-06 16:30:38 -070054bool WifiStaIface::isValid() { return is_valid_; }
Roshan Pius907d4a22016-10-27 12:48:12 -070055
Roshan Pius675609b2017-10-31 14:24:58 -070056std::string WifiStaIface::getName() { return ifname_; }
57
Roshan Piusd37341f2017-01-31 13:13:28 -080058std::set<sp<IWifiStaIfaceEventCallback>> WifiStaIface::getEventCallbacks() {
Roshan Piusabcf78f2017-10-06 16:30:38 -070059 return event_cb_handler_.getCallbacks();
Roshan Pius970f0312016-12-05 15:25:51 -080060}
61
Roshan Pius734fea02016-10-11 08:30:28 -070062Return<void> WifiStaIface::getName(getName_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070063 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
64 &WifiStaIface::getNameInternal, hidl_status_cb);
Roshan Pius3e2d6712016-10-06 13:16:23 -070065}
66
Roshan Pius734fea02016-10-11 08:30:28 -070067Return<void> WifiStaIface::getType(getType_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070068 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
69 &WifiStaIface::getTypeInternal, hidl_status_cb);
Roshan Pius907d4a22016-10-27 12:48:12 -070070}
71
Roshan Piusa04ba3f2016-10-27 14:36:26 -070072Return<void> WifiStaIface::registerEventCallback(
73 const sp<IWifiStaIfaceEventCallback>& callback,
74 registerEventCallback_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070075 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
76 &WifiStaIface::registerEventCallbackInternal,
77 hidl_status_cb, callback);
Roshan Piusa04ba3f2016-10-27 14:36:26 -070078}
79
80Return<void> WifiStaIface::getCapabilities(getCapabilities_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070081 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
82 &WifiStaIface::getCapabilitiesInternal,
83 hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -070084}
85
86Return<void> WifiStaIface::getApfPacketFilterCapabilities(
87 getApfPacketFilterCapabilities_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070088 return validateAndCall(
89 this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
90 &WifiStaIface::getApfPacketFilterCapabilitiesInternal, hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -070091}
92
93Return<void> WifiStaIface::installApfPacketFilter(
Roshan Piusabcf78f2017-10-06 16:30:38 -070094 uint32_t cmd_id, const hidl_vec<uint8_t>& program,
Roshan Piusa04ba3f2016-10-27 14:36:26 -070095 installApfPacketFilter_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -070096 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
97 &WifiStaIface::installApfPacketFilterInternal,
98 hidl_status_cb, cmd_id, program);
Roshan Piusa04ba3f2016-10-27 14:36:26 -070099}
100
Bernie Innocenti7e6f71a2018-03-07 00:17:50 +0900101Return<void> WifiStaIface::readApfPacketFilterData(
102 readApfPacketFilterData_cb hidl_status_cb) {
103 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
104 &WifiStaIface::readApfPacketFilterDataInternal,
105 hidl_status_cb);
106}
107
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700108Return<void> WifiStaIface::getBackgroundScanCapabilities(
109 getBackgroundScanCapabilities_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700110 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
111 &WifiStaIface::getBackgroundScanCapabilitiesInternal,
112 hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700113}
114
Roshan Pius7f4574d2017-02-22 09:48:03 -0800115Return<void> WifiStaIface::getValidFrequenciesForBand(
Ahmed ElArabawyfd809fc2019-11-15 18:19:15 -0800116 V1_0::WifiBand band, getValidFrequenciesForBand_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700117 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
118 &WifiStaIface::getValidFrequenciesForBandInternal,
119 hidl_status_cb, band);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700120}
121
122Return<void> WifiStaIface::startBackgroundScan(
Roshan Piusabcf78f2017-10-06 16:30:38 -0700123 uint32_t cmd_id, const StaBackgroundScanParameters& params,
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700124 startBackgroundScan_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700125 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
126 &WifiStaIface::startBackgroundScanInternal,
127 hidl_status_cb, cmd_id, params);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700128}
129
130Return<void> WifiStaIface::stopBackgroundScan(
131 uint32_t cmd_id, stopBackgroundScan_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700132 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
133 &WifiStaIface::stopBackgroundScanInternal,
134 hidl_status_cb, cmd_id);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700135}
136
137Return<void> WifiStaIface::enableLinkLayerStatsCollection(
138 bool debug, enableLinkLayerStatsCollection_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700139 return validateAndCall(
140 this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
141 &WifiStaIface::enableLinkLayerStatsCollectionInternal, hidl_status_cb,
142 debug);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700143}
144
145Return<void> WifiStaIface::disableLinkLayerStatsCollection(
146 disableLinkLayerStatsCollection_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700147 return validateAndCall(
148 this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
149 &WifiStaIface::disableLinkLayerStatsCollectionInternal, hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700150}
151
152Return<void> WifiStaIface::getLinkLayerStats(
153 getLinkLayerStats_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700154 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
155 &WifiStaIface::getLinkLayerStatsInternal,
156 hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700157}
158
xshue9873252018-08-07 11:04:34 -0700159Return<void> WifiStaIface::getLinkLayerStats_1_3(
160 getLinkLayerStats_1_3_cb hidl_status_cb) {
161 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
162 &WifiStaIface::getLinkLayerStatsInternal_1_3,
163 hidl_status_cb);
164}
165
Roshan Piusd4767542016-12-06 10:04:05 -0800166Return<void> WifiStaIface::startRssiMonitoring(
Roshan Piusabcf78f2017-10-06 16:30:38 -0700167 uint32_t cmd_id, int32_t max_rssi, int32_t min_rssi,
Roshan Piusd4767542016-12-06 10:04:05 -0800168 startRssiMonitoring_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700169 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
170 &WifiStaIface::startRssiMonitoringInternal,
171 hidl_status_cb, cmd_id, max_rssi, min_rssi);
Roshan Piusd4767542016-12-06 10:04:05 -0800172}
173
174Return<void> WifiStaIface::stopRssiMonitoring(
175 uint32_t cmd_id, stopRssiMonitoring_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700176 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
177 &WifiStaIface::stopRssiMonitoringInternal,
178 hidl_status_cb, cmd_id);
Roshan Piusd4767542016-12-06 10:04:05 -0800179}
180
Roshan Pius26801cb2016-12-13 14:25:45 -0800181Return<void> WifiStaIface::getRoamingCapabilities(
182 getRoamingCapabilities_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700183 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
184 &WifiStaIface::getRoamingCapabilitiesInternal,
185 hidl_status_cb);
Roshan Pius26801cb2016-12-13 14:25:45 -0800186}
187
188Return<void> WifiStaIface::configureRoaming(
189 const StaRoamingConfig& config, configureRoaming_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700190 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
191 &WifiStaIface::configureRoamingInternal,
192 hidl_status_cb, config);
Roshan Pius26801cb2016-12-13 14:25:45 -0800193}
194
195Return<void> WifiStaIface::setRoamingState(StaRoamingState state,
196 setRoamingState_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700197 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
198 &WifiStaIface::setRoamingStateInternal,
199 hidl_status_cb, state);
Roshan Pius26801cb2016-12-13 14:25:45 -0800200}
201
Roshan Piusaf727c02017-01-11 15:37:25 -0800202Return<void> WifiStaIface::enableNdOffload(bool enable,
203 enableNdOffload_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700204 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
205 &WifiStaIface::enableNdOffloadInternal,
206 hidl_status_cb, enable);
Roshan Piusaf727c02017-01-11 15:37:25 -0800207}
208
Roshan Pius9a9869a2017-01-11 16:42:16 -0800209Return<void> WifiStaIface::startSendingKeepAlivePackets(
Roshan Piusabcf78f2017-10-06 16:30:38 -0700210 uint32_t cmd_id, const hidl_vec<uint8_t>& ip_packet_data,
211 uint16_t ether_type, const hidl_array<uint8_t, 6>& src_address,
212 const hidl_array<uint8_t, 6>& dst_address, uint32_t period_in_ms,
Roshan Pius9a9869a2017-01-11 16:42:16 -0800213 startSendingKeepAlivePackets_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700214 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
215 &WifiStaIface::startSendingKeepAlivePacketsInternal,
216 hidl_status_cb, cmd_id, ip_packet_data, ether_type,
217 src_address, dst_address, period_in_ms);
Roshan Pius9a9869a2017-01-11 16:42:16 -0800218}
219
220Return<void> WifiStaIface::stopSendingKeepAlivePackets(
221 uint32_t cmd_id, stopSendingKeepAlivePackets_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700222 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
223 &WifiStaIface::stopSendingKeepAlivePacketsInternal,
224 hidl_status_cb, cmd_id);
Roshan Pius9a9869a2017-01-11 16:42:16 -0800225}
226
Roshan Pius795bb812017-02-01 13:09:08 -0800227Return<void> WifiStaIface::setScanningMacOui(
228 const hidl_array<uint8_t, 3>& oui, setScanningMacOui_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700229 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
230 &WifiStaIface::setScanningMacOuiInternal,
231 hidl_status_cb, oui);
Roshan Pius795bb812017-02-01 13:09:08 -0800232}
233
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700234Return<void> WifiStaIface::startDebugPacketFateMonitoring(
235 startDebugPacketFateMonitoring_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700236 return validateAndCall(
237 this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
238 &WifiStaIface::startDebugPacketFateMonitoringInternal, hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700239}
240
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700241Return<void> WifiStaIface::getDebugTxPacketFates(
242 getDebugTxPacketFates_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700243 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
244 &WifiStaIface::getDebugTxPacketFatesInternal,
245 hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700246}
247
248Return<void> WifiStaIface::getDebugRxPacketFates(
249 getDebugRxPacketFates_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700250 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
251 &WifiStaIface::getDebugRxPacketFatesInternal,
252 hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700253}
254
Jong Wook Kimb9f0ff92018-03-16 16:21:49 -0700255Return<void> WifiStaIface::setMacAddress(const hidl_array<uint8_t, 6>& mac,
256 setMacAddress_cb hidl_status_cb) {
257 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
258 &WifiStaIface::setMacAddressInternal, hidl_status_cb,
259 mac);
260}
261
Jong Wook Kim0ee77432018-08-08 18:57:26 -0700262Return<void> WifiStaIface::getFactoryMacAddress(
263 getFactoryMacAddress_cb hidl_status_cb) {
264 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
265 &WifiStaIface::getFactoryMacAddressInternal,
266 hidl_status_cb);
267}
268
Ahmed ElArabawy95e36b72019-11-15 21:24:53 +0000269Return<void> WifiStaIface::getCapabilities_1_4(
270 getCapabilities_cb hidl_status_cb) {
271 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
272 &WifiStaIface::getCapabilitiesInternal_1_4,
273 hidl_status_cb);
274}
275
Roshan Pius907d4a22016-10-27 12:48:12 -0700276std::pair<WifiStatus, std::string> WifiStaIface::getNameInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700277 return {createWifiStatus(WifiStatusCode::SUCCESS), ifname_};
Roshan Pius907d4a22016-10-27 12:48:12 -0700278}
279
280std::pair<WifiStatus, IfaceType> WifiStaIface::getTypeInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700281 return {createWifiStatus(WifiStatusCode::SUCCESS), IfaceType::STA};
Roshan Pius3e2d6712016-10-06 13:16:23 -0700282}
283
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700284WifiStatus WifiStaIface::registerEventCallbackInternal(
285 const sp<IWifiStaIfaceEventCallback>& callback) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700286 if (!event_cb_handler_.addCallback(callback)) {
287 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
288 }
289 return createWifiStatus(WifiStatusCode::SUCCESS);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700290}
291
292std::pair<WifiStatus, uint32_t> WifiStaIface::getCapabilitiesInternal() {
Ahmed ElArabawy95e36b72019-11-15 21:24:53 +0000293 return {createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED), 0};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700294}
295
296std::pair<WifiStatus, StaApfPacketFilterCapabilities>
297WifiStaIface::getApfPacketFilterCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700298 legacy_hal::wifi_error legacy_status;
299 legacy_hal::PacketFilterCapabilities legacy_caps;
300 std::tie(legacy_status, legacy_caps) =
301 legacy_hal_.lock()->getPacketFilterCapabilities(ifname_);
302 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
303 return {createWifiStatusFromLegacyError(legacy_status), {}};
304 }
305 StaApfPacketFilterCapabilities hidl_caps;
306 if (!hidl_struct_util::convertLegacyApfCapabilitiesToHidl(legacy_caps,
307 &hidl_caps)) {
308 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
309 }
310 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700311}
312
313WifiStatus WifiStaIface::installApfPacketFilterInternal(
Roshan Pius970f0312016-12-05 15:25:51 -0800314 uint32_t /* cmd_id */, const std::vector<uint8_t>& program) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700315 legacy_hal::wifi_error legacy_status =
316 legacy_hal_.lock()->setPacketFilter(ifname_, program);
317 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700318}
319
Bernie Innocenti7e6f71a2018-03-07 00:17:50 +0900320std::pair<WifiStatus, std::vector<uint8_t>>
321WifiStaIface::readApfPacketFilterDataInternal() {
322 const std::pair<legacy_hal::wifi_error, std::vector<uint8_t>>
323 legacy_status_and_data =
324 legacy_hal_.lock()->readApfPacketFilterData(ifname_);
325 return {createWifiStatusFromLegacyError(legacy_status_and_data.first),
326 std::move(legacy_status_and_data.second)};
327}
328
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700329std::pair<WifiStatus, StaBackgroundScanCapabilities>
330WifiStaIface::getBackgroundScanCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700331 legacy_hal::wifi_error legacy_status;
332 legacy_hal::wifi_gscan_capabilities legacy_caps;
333 std::tie(legacy_status, legacy_caps) =
334 legacy_hal_.lock()->getGscanCapabilities(ifname_);
335 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
336 return {createWifiStatusFromLegacyError(legacy_status), {}};
337 }
338 StaBackgroundScanCapabilities hidl_caps;
339 if (!hidl_struct_util::convertLegacyGscanCapabilitiesToHidl(legacy_caps,
340 &hidl_caps)) {
341 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
342 }
343 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700344}
345
346std::pair<WifiStatus, std::vector<WifiChannelInMhz>>
Ahmed ElArabawyfd809fc2019-11-15 18:19:15 -0800347WifiStaIface::getValidFrequenciesForBandInternal(V1_0::WifiBand band) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700348 static_assert(sizeof(WifiChannelInMhz) == sizeof(uint32_t),
349 "Size mismatch");
350 legacy_hal::wifi_error legacy_status;
351 std::vector<uint32_t> valid_frequencies;
352 std::tie(legacy_status, valid_frequencies) =
353 legacy_hal_.lock()->getValidFrequenciesForBand(
354 ifname_, hidl_struct_util::convertHidlWifiBandToLegacy(band));
355 return {createWifiStatusFromLegacyError(legacy_status), valid_frequencies};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700356}
357
358WifiStatus WifiStaIface::startBackgroundScanInternal(
Roshan Pius970f0312016-12-05 15:25:51 -0800359 uint32_t cmd_id, const StaBackgroundScanParameters& params) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700360 legacy_hal::wifi_scan_cmd_params legacy_params;
361 if (!hidl_struct_util::convertHidlGscanParamsToLegacy(params,
362 &legacy_params)) {
363 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
364 }
365 android::wp<WifiStaIface> weak_ptr_this(this);
366 const auto& on_failure_callback =
367 [weak_ptr_this](legacy_hal::wifi_request_id id) {
368 const auto shared_ptr_this = weak_ptr_this.promote();
369 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
370 LOG(ERROR) << "Callback invoked on an invalid object";
371 return;
372 }
373 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
374 if (!callback->onBackgroundScanFailure(id).isOk()) {
375 LOG(ERROR)
376 << "Failed to invoke onBackgroundScanFailure callback";
377 }
378 }
379 };
380 const auto& on_results_callback =
381 [weak_ptr_this](
382 legacy_hal::wifi_request_id id,
383 const std::vector<legacy_hal::wifi_cached_scan_results>& results) {
384 const auto shared_ptr_this = weak_ptr_this.promote();
385 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
386 LOG(ERROR) << "Callback invoked on an invalid object";
387 return;
388 }
389 std::vector<StaScanData> hidl_scan_datas;
390 if (!hidl_struct_util::
391 convertLegacyVectorOfCachedGscanResultsToHidl(
392 results, &hidl_scan_datas)) {
393 LOG(ERROR) << "Failed to convert scan results to HIDL structs";
394 return;
395 }
396 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
397 if (!callback->onBackgroundScanResults(id, hidl_scan_datas)
398 .isOk()) {
399 LOG(ERROR)
400 << "Failed to invoke onBackgroundScanResults callback";
401 }
402 }
403 };
404 const auto& on_full_result_callback = [weak_ptr_this](
405 legacy_hal::wifi_request_id id,
406 const legacy_hal::
407 wifi_scan_result* result,
408 uint32_t buckets_scanned) {
Roshan Pius970f0312016-12-05 15:25:51 -0800409 const auto shared_ptr_this = weak_ptr_this.promote();
410 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700411 LOG(ERROR) << "Callback invoked on an invalid object";
412 return;
413 }
414 StaScanResult hidl_scan_result;
415 if (!hidl_struct_util::convertLegacyGscanResultToHidl(
416 *result, true, &hidl_scan_result)) {
417 LOG(ERROR) << "Failed to convert full scan results to HIDL structs";
418 return;
Roshan Pius970f0312016-12-05 15:25:51 -0800419 }
420 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700421 if (!callback
422 ->onBackgroundFullScanResult(id, buckets_scanned,
423 hidl_scan_result)
424 .isOk()) {
425 LOG(ERROR)
426 << "Failed to invoke onBackgroundFullScanResult callback";
427 }
Roshan Pius970f0312016-12-05 15:25:51 -0800428 }
Roshan Piusabcf78f2017-10-06 16:30:38 -0700429 };
430 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->startGscan(
431 ifname_, cmd_id, legacy_params, on_failure_callback,
432 on_results_callback, on_full_result_callback);
433 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700434}
435
Roshan Pius970f0312016-12-05 15:25:51 -0800436WifiStatus WifiStaIface::stopBackgroundScanInternal(uint32_t cmd_id) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700437 legacy_hal::wifi_error legacy_status =
438 legacy_hal_.lock()->stopGscan(ifname_, cmd_id);
439 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700440}
441
Roshan Pius970f0312016-12-05 15:25:51 -0800442WifiStatus WifiStaIface::enableLinkLayerStatsCollectionInternal(bool debug) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700443 legacy_hal::wifi_error legacy_status =
444 legacy_hal_.lock()->enableLinkLayerStats(ifname_, debug);
445 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700446}
447
448WifiStatus WifiStaIface::disableLinkLayerStatsCollectionInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700449 legacy_hal::wifi_error legacy_status =
450 legacy_hal_.lock()->disableLinkLayerStats(ifname_);
451 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700452}
453
xshue9873252018-08-07 11:04:34 -0700454std::pair<WifiStatus, V1_0::StaLinkLayerStats>
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700455WifiStaIface::getLinkLayerStatsInternal() {
xshue9873252018-08-07 11:04:34 -0700456 return {createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED), {}};
457}
458
459std::pair<WifiStatus, V1_3::StaLinkLayerStats>
460WifiStaIface::getLinkLayerStatsInternal_1_3() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700461 legacy_hal::wifi_error legacy_status;
462 legacy_hal::LinkLayerStats legacy_stats;
463 std::tie(legacy_status, legacy_stats) =
464 legacy_hal_.lock()->getLinkLayerStats(ifname_);
465 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
466 return {createWifiStatusFromLegacyError(legacy_status), {}};
467 }
xshue9873252018-08-07 11:04:34 -0700468 V1_3::StaLinkLayerStats hidl_stats;
Roshan Piusabcf78f2017-10-06 16:30:38 -0700469 if (!hidl_struct_util::convertLegacyLinkLayerStatsToHidl(legacy_stats,
470 &hidl_stats)) {
471 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
472 }
473 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_stats};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700474}
475
Roshan Piusd4767542016-12-06 10:04:05 -0800476WifiStatus WifiStaIface::startRssiMonitoringInternal(uint32_t cmd_id,
477 int32_t max_rssi,
478 int32_t min_rssi) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700479 android::wp<WifiStaIface> weak_ptr_this(this);
480 const auto& on_threshold_breached_callback =
481 [weak_ptr_this](legacy_hal::wifi_request_id id,
482 std::array<uint8_t, 6> bssid, int8_t rssi) {
483 const auto shared_ptr_this = weak_ptr_this.promote();
484 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
485 LOG(ERROR) << "Callback invoked on an invalid object";
486 return;
487 }
488 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
489 if (!callback->onRssiThresholdBreached(id, bssid, rssi)
490 .isOk()) {
491 LOG(ERROR)
492 << "Failed to invoke onRssiThresholdBreached callback";
493 }
494 }
495 };
496 legacy_hal::wifi_error legacy_status =
497 legacy_hal_.lock()->startRssiMonitoring(ifname_, cmd_id, max_rssi,
498 min_rssi,
499 on_threshold_breached_callback);
500 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusd4767542016-12-06 10:04:05 -0800501}
502
503WifiStatus WifiStaIface::stopRssiMonitoringInternal(uint32_t cmd_id) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700504 legacy_hal::wifi_error legacy_status =
505 legacy_hal_.lock()->stopRssiMonitoring(ifname_, cmd_id);
506 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusd4767542016-12-06 10:04:05 -0800507}
508
Roshan Pius26801cb2016-12-13 14:25:45 -0800509std::pair<WifiStatus, StaRoamingCapabilities>
510WifiStaIface::getRoamingCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700511 legacy_hal::wifi_error legacy_status;
512 legacy_hal::wifi_roaming_capabilities legacy_caps;
513 std::tie(legacy_status, legacy_caps) =
514 legacy_hal_.lock()->getRoamingCapabilities(ifname_);
515 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
516 return {createWifiStatusFromLegacyError(legacy_status), {}};
517 }
518 StaRoamingCapabilities hidl_caps;
519 if (!hidl_struct_util::convertLegacyRoamingCapabilitiesToHidl(legacy_caps,
520 &hidl_caps)) {
521 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
522 }
523 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Pius26801cb2016-12-13 14:25:45 -0800524}
525
526WifiStatus WifiStaIface::configureRoamingInternal(
527 const StaRoamingConfig& config) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700528 legacy_hal::wifi_roaming_config legacy_config;
529 if (!hidl_struct_util::convertHidlRoamingConfigToLegacy(config,
530 &legacy_config)) {
531 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
532 }
533 legacy_hal::wifi_error legacy_status =
534 legacy_hal_.lock()->configureRoaming(ifname_, legacy_config);
535 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius26801cb2016-12-13 14:25:45 -0800536}
537
538WifiStatus WifiStaIface::setRoamingStateInternal(StaRoamingState state) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700539 legacy_hal::wifi_error legacy_status =
540 legacy_hal_.lock()->enableFirmwareRoaming(
541 ifname_, hidl_struct_util::convertHidlRoamingStateToLegacy(state));
542 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius26801cb2016-12-13 14:25:45 -0800543}
544
Roshan Piusaf727c02017-01-11 15:37:25 -0800545WifiStatus WifiStaIface::enableNdOffloadInternal(bool enable) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700546 legacy_hal::wifi_error legacy_status =
547 legacy_hal_.lock()->configureNdOffload(ifname_, enable);
548 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusaf727c02017-01-11 15:37:25 -0800549}
550
Roshan Pius9a9869a2017-01-11 16:42:16 -0800551WifiStatus WifiStaIface::startSendingKeepAlivePacketsInternal(
Roshan Piusabcf78f2017-10-06 16:30:38 -0700552 uint32_t cmd_id, const std::vector<uint8_t>& ip_packet_data,
Ahmed ElArabawyffbad182019-03-05 17:38:06 -0800553 uint16_t ether_type, const std::array<uint8_t, 6>& src_address,
Roshan Piusabcf78f2017-10-06 16:30:38 -0700554 const std::array<uint8_t, 6>& dst_address, uint32_t period_in_ms) {
555 legacy_hal::wifi_error legacy_status =
556 legacy_hal_.lock()->startSendingOffloadedPacket(
Ahmed ElArabawyffbad182019-03-05 17:38:06 -0800557 ifname_, cmd_id, ether_type, ip_packet_data, src_address,
558 dst_address, period_in_ms);
Roshan Piusabcf78f2017-10-06 16:30:38 -0700559 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius9a9869a2017-01-11 16:42:16 -0800560}
561
562WifiStatus WifiStaIface::stopSendingKeepAlivePacketsInternal(uint32_t cmd_id) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700563 legacy_hal::wifi_error legacy_status =
564 legacy_hal_.lock()->stopSendingOffloadedPacket(ifname_, cmd_id);
565 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius9a9869a2017-01-11 16:42:16 -0800566}
567
Roshan Piusd37341f2017-01-31 13:13:28 -0800568WifiStatus WifiStaIface::setScanningMacOuiInternal(
569 const std::array<uint8_t, 3>& oui) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700570 legacy_hal::wifi_error legacy_status =
571 legacy_hal_.lock()->setScanningMacOui(ifname_, oui);
572 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius795bb812017-02-01 13:09:08 -0800573}
574
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700575WifiStatus WifiStaIface::startDebugPacketFateMonitoringInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700576 legacy_hal::wifi_error legacy_status =
577 legacy_hal_.lock()->startPktFateMonitoring(ifname_);
578 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700579}
580
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700581std::pair<WifiStatus, std::vector<WifiDebugTxPacketFateReport>>
582WifiStaIface::getDebugTxPacketFatesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700583 legacy_hal::wifi_error legacy_status;
584 std::vector<legacy_hal::wifi_tx_report> legacy_fates;
585 std::tie(legacy_status, legacy_fates) =
586 legacy_hal_.lock()->getTxPktFates(ifname_);
587 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
588 return {createWifiStatusFromLegacyError(legacy_status), {}};
589 }
590 std::vector<WifiDebugTxPacketFateReport> hidl_fates;
591 if (!hidl_struct_util::convertLegacyVectorOfDebugTxPacketFateToHidl(
592 legacy_fates, &hidl_fates)) {
593 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
594 }
595 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_fates};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700596}
597
598std::pair<WifiStatus, std::vector<WifiDebugRxPacketFateReport>>
599WifiStaIface::getDebugRxPacketFatesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700600 legacy_hal::wifi_error legacy_status;
601 std::vector<legacy_hal::wifi_rx_report> legacy_fates;
602 std::tie(legacy_status, legacy_fates) =
603 legacy_hal_.lock()->getRxPktFates(ifname_);
604 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
605 return {createWifiStatusFromLegacyError(legacy_status), {}};
606 }
607 std::vector<WifiDebugRxPacketFateReport> hidl_fates;
608 if (!hidl_struct_util::convertLegacyVectorOfDebugRxPacketFateToHidl(
609 legacy_fates, &hidl_fates)) {
610 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
611 }
612 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_fates};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700613}
614
Jong Wook Kimb9f0ff92018-03-16 16:21:49 -0700615WifiStatus WifiStaIface::setMacAddressInternal(
616 const std::array<uint8_t, 6>& mac) {
Roshan Pius99dab382019-02-14 07:57:10 -0800617 bool status = iface_util_.lock()->setMacAddress(ifname_, mac);
618 if (!status) {
Jong Wook Kimb9f0ff92018-03-16 16:21:49 -0700619 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
620 }
Jong Wook Kimb9f0ff92018-03-16 16:21:49 -0700621 return createWifiStatus(WifiStatusCode::SUCCESS);
622}
623
Jong Wook Kim0ee77432018-08-08 18:57:26 -0700624std::pair<WifiStatus, std::array<uint8_t, 6>>
625WifiStaIface::getFactoryMacAddressInternal() {
626 std::array<uint8_t, 6> mac =
Roshan Pius99dab382019-02-14 07:57:10 -0800627 iface_util_.lock()->getFactoryMacAddress(ifname_);
Jong Wook Kim0ee77432018-08-08 18:57:26 -0700628 return {createWifiStatus(WifiStatusCode::SUCCESS), mac};
629}
630
Ahmed ElArabawy95e36b72019-11-15 21:24:53 +0000631std::pair<WifiStatus, uint32_t> WifiStaIface::getCapabilitiesInternal_1_4() {
632 legacy_hal::wifi_error legacy_status;
633 uint64_t legacy_feature_set;
634 std::tie(legacy_status, legacy_feature_set) =
635 legacy_hal_.lock()->getSupportedFeatureSet(ifname_);
636 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
637 return {createWifiStatusFromLegacyError(legacy_status), 0};
638 }
639 uint32_t legacy_logger_feature_set;
640 std::tie(legacy_status, legacy_logger_feature_set) =
641 legacy_hal_.lock()->getLoggerSupportedFeatureSet(ifname_);
642 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
643 // some devices don't support querying logger feature set
644 legacy_logger_feature_set = 0;
645 }
646 uint32_t hidl_caps;
647 if (!hidl_struct_util::convertLegacyFeaturesToHidlStaCapabilities(
648 legacy_feature_set, legacy_logger_feature_set, &hidl_caps)) {
649 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), 0};
650 }
651 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
652}
653
Roshan Pius3e2d6712016-10-06 13:16:23 -0700654} // namespace implementation
Ahmed ElArabawyf501a982019-07-23 15:02:22 -0700655} // namespace V1_4
Roshan Pius3e2d6712016-10-06 13:16:23 -0700656} // namespace wifi
657} // namespace hardware
658} // namespace android