blob: f3dcfc5bca3a74fbc02f1df6f7f6d38c68fd5d3f [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 {
Jimmy Chend460df32019-11-29 17:31:22 +020027namespace V1_5 {
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 Piuse9d1e7d2020-11-04 11:44:16 -0800166Return<void> WifiStaIface::getLinkLayerStats_1_5(
167 getLinkLayerStats_1_5_cb hidl_status_cb) {
168 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
169 &WifiStaIface::getLinkLayerStatsInternal_1_5,
170 hidl_status_cb);
171}
172
Roshan Piusd4767542016-12-06 10:04:05 -0800173Return<void> WifiStaIface::startRssiMonitoring(
Roshan Piusabcf78f2017-10-06 16:30:38 -0700174 uint32_t cmd_id, int32_t max_rssi, int32_t min_rssi,
Roshan Piusd4767542016-12-06 10:04:05 -0800175 startRssiMonitoring_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700176 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
177 &WifiStaIface::startRssiMonitoringInternal,
178 hidl_status_cb, cmd_id, max_rssi, min_rssi);
Roshan Piusd4767542016-12-06 10:04:05 -0800179}
180
181Return<void> WifiStaIface::stopRssiMonitoring(
182 uint32_t cmd_id, stopRssiMonitoring_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700183 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
184 &WifiStaIface::stopRssiMonitoringInternal,
185 hidl_status_cb, cmd_id);
Roshan Piusd4767542016-12-06 10:04:05 -0800186}
187
Roshan Pius26801cb2016-12-13 14:25:45 -0800188Return<void> WifiStaIface::getRoamingCapabilities(
189 getRoamingCapabilities_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700190 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
191 &WifiStaIface::getRoamingCapabilitiesInternal,
192 hidl_status_cb);
Roshan Pius26801cb2016-12-13 14:25:45 -0800193}
194
195Return<void> WifiStaIface::configureRoaming(
196 const StaRoamingConfig& config, configureRoaming_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700197 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
198 &WifiStaIface::configureRoamingInternal,
199 hidl_status_cb, config);
Roshan Pius26801cb2016-12-13 14:25:45 -0800200}
201
202Return<void> WifiStaIface::setRoamingState(StaRoamingState state,
203 setRoamingState_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700204 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
205 &WifiStaIface::setRoamingStateInternal,
206 hidl_status_cb, state);
Roshan Pius26801cb2016-12-13 14:25:45 -0800207}
208
Roshan Piusaf727c02017-01-11 15:37:25 -0800209Return<void> WifiStaIface::enableNdOffload(bool enable,
210 enableNdOffload_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700211 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
212 &WifiStaIface::enableNdOffloadInternal,
213 hidl_status_cb, enable);
Roshan Piusaf727c02017-01-11 15:37:25 -0800214}
215
Roshan Pius9a9869a2017-01-11 16:42:16 -0800216Return<void> WifiStaIface::startSendingKeepAlivePackets(
Roshan Piusabcf78f2017-10-06 16:30:38 -0700217 uint32_t cmd_id, const hidl_vec<uint8_t>& ip_packet_data,
218 uint16_t ether_type, const hidl_array<uint8_t, 6>& src_address,
219 const hidl_array<uint8_t, 6>& dst_address, uint32_t period_in_ms,
Roshan Pius9a9869a2017-01-11 16:42:16 -0800220 startSendingKeepAlivePackets_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700221 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
222 &WifiStaIface::startSendingKeepAlivePacketsInternal,
223 hidl_status_cb, cmd_id, ip_packet_data, ether_type,
224 src_address, dst_address, period_in_ms);
Roshan Pius9a9869a2017-01-11 16:42:16 -0800225}
226
227Return<void> WifiStaIface::stopSendingKeepAlivePackets(
228 uint32_t cmd_id, stopSendingKeepAlivePackets_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700229 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
230 &WifiStaIface::stopSendingKeepAlivePacketsInternal,
231 hidl_status_cb, cmd_id);
Roshan Pius9a9869a2017-01-11 16:42:16 -0800232}
233
Roshan Pius795bb812017-02-01 13:09:08 -0800234Return<void> WifiStaIface::setScanningMacOui(
235 const hidl_array<uint8_t, 3>& oui, setScanningMacOui_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700236 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
237 &WifiStaIface::setScanningMacOuiInternal,
238 hidl_status_cb, oui);
Roshan Pius795bb812017-02-01 13:09:08 -0800239}
240
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700241Return<void> WifiStaIface::startDebugPacketFateMonitoring(
242 startDebugPacketFateMonitoring_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700243 return validateAndCall(
244 this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
245 &WifiStaIface::startDebugPacketFateMonitoringInternal, hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700246}
247
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700248Return<void> WifiStaIface::getDebugTxPacketFates(
249 getDebugTxPacketFates_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700250 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
251 &WifiStaIface::getDebugTxPacketFatesInternal,
252 hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700253}
254
255Return<void> WifiStaIface::getDebugRxPacketFates(
256 getDebugRxPacketFates_cb hidl_status_cb) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700257 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
258 &WifiStaIface::getDebugRxPacketFatesInternal,
259 hidl_status_cb);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700260}
261
Jong Wook Kimb9f0ff92018-03-16 16:21:49 -0700262Return<void> WifiStaIface::setMacAddress(const hidl_array<uint8_t, 6>& mac,
263 setMacAddress_cb hidl_status_cb) {
264 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
265 &WifiStaIface::setMacAddressInternal, hidl_status_cb,
266 mac);
267}
268
Jong Wook Kim0ee77432018-08-08 18:57:26 -0700269Return<void> WifiStaIface::getFactoryMacAddress(
270 getFactoryMacAddress_cb hidl_status_cb) {
271 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
272 &WifiStaIface::getFactoryMacAddressInternal,
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 ElArabawyb23485d2019-12-09 15:24:16 -0800293 legacy_hal::wifi_error legacy_status;
294 uint64_t legacy_feature_set;
295 std::tie(legacy_status, legacy_feature_set) =
296 legacy_hal_.lock()->getSupportedFeatureSet(ifname_);
297 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
298 return {createWifiStatusFromLegacyError(legacy_status), 0};
299 }
300 uint32_t legacy_logger_feature_set;
301 std::tie(legacy_status, legacy_logger_feature_set) =
302 legacy_hal_.lock()->getLoggerSupportedFeatureSet(ifname_);
303 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
304 // some devices don't support querying logger feature set
305 legacy_logger_feature_set = 0;
306 }
307 uint32_t hidl_caps;
308 if (!hidl_struct_util::convertLegacyFeaturesToHidlStaCapabilities(
309 legacy_feature_set, legacy_logger_feature_set, &hidl_caps)) {
310 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), 0};
311 }
312 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700313}
314
315std::pair<WifiStatus, StaApfPacketFilterCapabilities>
316WifiStaIface::getApfPacketFilterCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700317 legacy_hal::wifi_error legacy_status;
318 legacy_hal::PacketFilterCapabilities legacy_caps;
319 std::tie(legacy_status, legacy_caps) =
320 legacy_hal_.lock()->getPacketFilterCapabilities(ifname_);
321 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
322 return {createWifiStatusFromLegacyError(legacy_status), {}};
323 }
324 StaApfPacketFilterCapabilities hidl_caps;
325 if (!hidl_struct_util::convertLegacyApfCapabilitiesToHidl(legacy_caps,
326 &hidl_caps)) {
327 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
328 }
329 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700330}
331
332WifiStatus WifiStaIface::installApfPacketFilterInternal(
Roshan Pius970f0312016-12-05 15:25:51 -0800333 uint32_t /* cmd_id */, const std::vector<uint8_t>& program) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700334 legacy_hal::wifi_error legacy_status =
335 legacy_hal_.lock()->setPacketFilter(ifname_, program);
336 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700337}
338
Bernie Innocenti7e6f71a2018-03-07 00:17:50 +0900339std::pair<WifiStatus, std::vector<uint8_t>>
340WifiStaIface::readApfPacketFilterDataInternal() {
341 const std::pair<legacy_hal::wifi_error, std::vector<uint8_t>>
342 legacy_status_and_data =
343 legacy_hal_.lock()->readApfPacketFilterData(ifname_);
344 return {createWifiStatusFromLegacyError(legacy_status_and_data.first),
345 std::move(legacy_status_and_data.second)};
346}
347
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700348std::pair<WifiStatus, StaBackgroundScanCapabilities>
349WifiStaIface::getBackgroundScanCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700350 legacy_hal::wifi_error legacy_status;
351 legacy_hal::wifi_gscan_capabilities legacy_caps;
352 std::tie(legacy_status, legacy_caps) =
353 legacy_hal_.lock()->getGscanCapabilities(ifname_);
354 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
355 return {createWifiStatusFromLegacyError(legacy_status), {}};
356 }
357 StaBackgroundScanCapabilities hidl_caps;
358 if (!hidl_struct_util::convertLegacyGscanCapabilitiesToHidl(legacy_caps,
359 &hidl_caps)) {
360 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
361 }
362 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700363}
364
365std::pair<WifiStatus, std::vector<WifiChannelInMhz>>
Ahmed ElArabawyfd809fc2019-11-15 18:19:15 -0800366WifiStaIface::getValidFrequenciesForBandInternal(V1_0::WifiBand band) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700367 static_assert(sizeof(WifiChannelInMhz) == sizeof(uint32_t),
368 "Size mismatch");
369 legacy_hal::wifi_error legacy_status;
370 std::vector<uint32_t> valid_frequencies;
371 std::tie(legacy_status, valid_frequencies) =
372 legacy_hal_.lock()->getValidFrequenciesForBand(
373 ifname_, hidl_struct_util::convertHidlWifiBandToLegacy(band));
374 return {createWifiStatusFromLegacyError(legacy_status), valid_frequencies};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700375}
376
377WifiStatus WifiStaIface::startBackgroundScanInternal(
Roshan Pius970f0312016-12-05 15:25:51 -0800378 uint32_t cmd_id, const StaBackgroundScanParameters& params) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700379 legacy_hal::wifi_scan_cmd_params legacy_params;
380 if (!hidl_struct_util::convertHidlGscanParamsToLegacy(params,
381 &legacy_params)) {
382 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
383 }
384 android::wp<WifiStaIface> weak_ptr_this(this);
385 const auto& on_failure_callback =
386 [weak_ptr_this](legacy_hal::wifi_request_id id) {
387 const auto shared_ptr_this = weak_ptr_this.promote();
388 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
389 LOG(ERROR) << "Callback invoked on an invalid object";
390 return;
391 }
392 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
393 if (!callback->onBackgroundScanFailure(id).isOk()) {
394 LOG(ERROR)
395 << "Failed to invoke onBackgroundScanFailure callback";
396 }
397 }
398 };
399 const auto& on_results_callback =
400 [weak_ptr_this](
401 legacy_hal::wifi_request_id id,
402 const std::vector<legacy_hal::wifi_cached_scan_results>& results) {
403 const auto shared_ptr_this = weak_ptr_this.promote();
404 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
405 LOG(ERROR) << "Callback invoked on an invalid object";
406 return;
407 }
408 std::vector<StaScanData> hidl_scan_datas;
409 if (!hidl_struct_util::
410 convertLegacyVectorOfCachedGscanResultsToHidl(
411 results, &hidl_scan_datas)) {
412 LOG(ERROR) << "Failed to convert scan results to HIDL structs";
413 return;
414 }
415 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
416 if (!callback->onBackgroundScanResults(id, hidl_scan_datas)
417 .isOk()) {
418 LOG(ERROR)
419 << "Failed to invoke onBackgroundScanResults callback";
420 }
421 }
422 };
423 const auto& on_full_result_callback = [weak_ptr_this](
424 legacy_hal::wifi_request_id id,
425 const legacy_hal::
426 wifi_scan_result* result,
427 uint32_t buckets_scanned) {
Roshan Pius970f0312016-12-05 15:25:51 -0800428 const auto shared_ptr_this = weak_ptr_this.promote();
429 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700430 LOG(ERROR) << "Callback invoked on an invalid object";
431 return;
432 }
433 StaScanResult hidl_scan_result;
434 if (!hidl_struct_util::convertLegacyGscanResultToHidl(
435 *result, true, &hidl_scan_result)) {
436 LOG(ERROR) << "Failed to convert full scan results to HIDL structs";
437 return;
Roshan Pius970f0312016-12-05 15:25:51 -0800438 }
439 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700440 if (!callback
441 ->onBackgroundFullScanResult(id, buckets_scanned,
442 hidl_scan_result)
443 .isOk()) {
444 LOG(ERROR)
445 << "Failed to invoke onBackgroundFullScanResult callback";
446 }
Roshan Pius970f0312016-12-05 15:25:51 -0800447 }
Roshan Piusabcf78f2017-10-06 16:30:38 -0700448 };
449 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->startGscan(
450 ifname_, cmd_id, legacy_params, on_failure_callback,
451 on_results_callback, on_full_result_callback);
452 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700453}
454
Roshan Pius970f0312016-12-05 15:25:51 -0800455WifiStatus WifiStaIface::stopBackgroundScanInternal(uint32_t cmd_id) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700456 legacy_hal::wifi_error legacy_status =
457 legacy_hal_.lock()->stopGscan(ifname_, cmd_id);
458 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700459}
460
Roshan Pius970f0312016-12-05 15:25:51 -0800461WifiStatus WifiStaIface::enableLinkLayerStatsCollectionInternal(bool debug) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700462 legacy_hal::wifi_error legacy_status =
463 legacy_hal_.lock()->enableLinkLayerStats(ifname_, debug);
464 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700465}
466
467WifiStatus WifiStaIface::disableLinkLayerStatsCollectionInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700468 legacy_hal::wifi_error legacy_status =
469 legacy_hal_.lock()->disableLinkLayerStats(ifname_);
470 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700471}
472
xshue9873252018-08-07 11:04:34 -0700473std::pair<WifiStatus, V1_0::StaLinkLayerStats>
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700474WifiStaIface::getLinkLayerStatsInternal() {
xshue9873252018-08-07 11:04:34 -0700475 return {createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED), {}};
476}
477
478std::pair<WifiStatus, V1_3::StaLinkLayerStats>
479WifiStaIface::getLinkLayerStatsInternal_1_3() {
Roshan Piuse9d1e7d2020-11-04 11:44:16 -0800480 return {createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED), {}};
481}
482
483std::pair<WifiStatus, V1_5::StaLinkLayerStats>
484WifiStaIface::getLinkLayerStatsInternal_1_5() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700485 legacy_hal::wifi_error legacy_status;
486 legacy_hal::LinkLayerStats legacy_stats;
487 std::tie(legacy_status, legacy_stats) =
488 legacy_hal_.lock()->getLinkLayerStats(ifname_);
489 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
490 return {createWifiStatusFromLegacyError(legacy_status), {}};
491 }
Roshan Piuse9d1e7d2020-11-04 11:44:16 -0800492 V1_5::StaLinkLayerStats hidl_stats;
Roshan Piusabcf78f2017-10-06 16:30:38 -0700493 if (!hidl_struct_util::convertLegacyLinkLayerStatsToHidl(legacy_stats,
494 &hidl_stats)) {
495 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
496 }
497 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_stats};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700498}
499
Roshan Piusd4767542016-12-06 10:04:05 -0800500WifiStatus WifiStaIface::startRssiMonitoringInternal(uint32_t cmd_id,
501 int32_t max_rssi,
502 int32_t min_rssi) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700503 android::wp<WifiStaIface> weak_ptr_this(this);
504 const auto& on_threshold_breached_callback =
505 [weak_ptr_this](legacy_hal::wifi_request_id id,
506 std::array<uint8_t, 6> bssid, int8_t rssi) {
507 const auto shared_ptr_this = weak_ptr_this.promote();
508 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
509 LOG(ERROR) << "Callback invoked on an invalid object";
510 return;
511 }
512 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
513 if (!callback->onRssiThresholdBreached(id, bssid, rssi)
514 .isOk()) {
515 LOG(ERROR)
516 << "Failed to invoke onRssiThresholdBreached callback";
517 }
518 }
519 };
520 legacy_hal::wifi_error legacy_status =
521 legacy_hal_.lock()->startRssiMonitoring(ifname_, cmd_id, max_rssi,
522 min_rssi,
523 on_threshold_breached_callback);
524 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusd4767542016-12-06 10:04:05 -0800525}
526
527WifiStatus WifiStaIface::stopRssiMonitoringInternal(uint32_t cmd_id) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700528 legacy_hal::wifi_error legacy_status =
529 legacy_hal_.lock()->stopRssiMonitoring(ifname_, cmd_id);
530 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusd4767542016-12-06 10:04:05 -0800531}
532
Roshan Pius26801cb2016-12-13 14:25:45 -0800533std::pair<WifiStatus, StaRoamingCapabilities>
534WifiStaIface::getRoamingCapabilitiesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700535 legacy_hal::wifi_error legacy_status;
536 legacy_hal::wifi_roaming_capabilities legacy_caps;
537 std::tie(legacy_status, legacy_caps) =
538 legacy_hal_.lock()->getRoamingCapabilities(ifname_);
539 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
540 return {createWifiStatusFromLegacyError(legacy_status), {}};
541 }
542 StaRoamingCapabilities hidl_caps;
543 if (!hidl_struct_util::convertLegacyRoamingCapabilitiesToHidl(legacy_caps,
544 &hidl_caps)) {
545 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
546 }
547 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Pius26801cb2016-12-13 14:25:45 -0800548}
549
550WifiStatus WifiStaIface::configureRoamingInternal(
551 const StaRoamingConfig& config) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700552 legacy_hal::wifi_roaming_config legacy_config;
553 if (!hidl_struct_util::convertHidlRoamingConfigToLegacy(config,
554 &legacy_config)) {
555 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
556 }
557 legacy_hal::wifi_error legacy_status =
558 legacy_hal_.lock()->configureRoaming(ifname_, legacy_config);
559 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius26801cb2016-12-13 14:25:45 -0800560}
561
562WifiStatus WifiStaIface::setRoamingStateInternal(StaRoamingState state) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700563 legacy_hal::wifi_error legacy_status =
564 legacy_hal_.lock()->enableFirmwareRoaming(
565 ifname_, hidl_struct_util::convertHidlRoamingStateToLegacy(state));
566 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius26801cb2016-12-13 14:25:45 -0800567}
568
Roshan Piusaf727c02017-01-11 15:37:25 -0800569WifiStatus WifiStaIface::enableNdOffloadInternal(bool enable) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700570 legacy_hal::wifi_error legacy_status =
571 legacy_hal_.lock()->configureNdOffload(ifname_, enable);
572 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusaf727c02017-01-11 15:37:25 -0800573}
574
Roshan Pius9a9869a2017-01-11 16:42:16 -0800575WifiStatus WifiStaIface::startSendingKeepAlivePacketsInternal(
Roshan Piusabcf78f2017-10-06 16:30:38 -0700576 uint32_t cmd_id, const std::vector<uint8_t>& ip_packet_data,
Ahmed ElArabawyffbad182019-03-05 17:38:06 -0800577 uint16_t ether_type, const std::array<uint8_t, 6>& src_address,
Roshan Piusabcf78f2017-10-06 16:30:38 -0700578 const std::array<uint8_t, 6>& dst_address, uint32_t period_in_ms) {
579 legacy_hal::wifi_error legacy_status =
580 legacy_hal_.lock()->startSendingOffloadedPacket(
Ahmed ElArabawyffbad182019-03-05 17:38:06 -0800581 ifname_, cmd_id, ether_type, ip_packet_data, src_address,
582 dst_address, period_in_ms);
Roshan Piusabcf78f2017-10-06 16:30:38 -0700583 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius9a9869a2017-01-11 16:42:16 -0800584}
585
586WifiStatus WifiStaIface::stopSendingKeepAlivePacketsInternal(uint32_t cmd_id) {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700587 legacy_hal::wifi_error legacy_status =
588 legacy_hal_.lock()->stopSendingOffloadedPacket(ifname_, cmd_id);
589 return createWifiStatusFromLegacyError(legacy_status);
Roshan Pius9a9869a2017-01-11 16:42:16 -0800590}
591
Roshan Piusd37341f2017-01-31 13:13:28 -0800592WifiStatus WifiStaIface::setScanningMacOuiInternal(
Roshan Pius322677a2020-04-16 16:18:23 -0700593 const std::array<uint8_t, 3>& /* oui */) {
594 // deprecated.
595 return createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED);
Roshan Pius795bb812017-02-01 13:09:08 -0800596}
597
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700598WifiStatus WifiStaIface::startDebugPacketFateMonitoringInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700599 legacy_hal::wifi_error legacy_status =
600 legacy_hal_.lock()->startPktFateMonitoring(ifname_);
601 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700602}
603
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700604std::pair<WifiStatus, std::vector<WifiDebugTxPacketFateReport>>
605WifiStaIface::getDebugTxPacketFatesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700606 legacy_hal::wifi_error legacy_status;
607 std::vector<legacy_hal::wifi_tx_report> legacy_fates;
608 std::tie(legacy_status, legacy_fates) =
609 legacy_hal_.lock()->getTxPktFates(ifname_);
610 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
611 return {createWifiStatusFromLegacyError(legacy_status), {}};
612 }
613 std::vector<WifiDebugTxPacketFateReport> hidl_fates;
614 if (!hidl_struct_util::convertLegacyVectorOfDebugTxPacketFateToHidl(
615 legacy_fates, &hidl_fates)) {
616 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
617 }
618 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_fates};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700619}
620
621std::pair<WifiStatus, std::vector<WifiDebugRxPacketFateReport>>
622WifiStaIface::getDebugRxPacketFatesInternal() {
Roshan Piusabcf78f2017-10-06 16:30:38 -0700623 legacy_hal::wifi_error legacy_status;
624 std::vector<legacy_hal::wifi_rx_report> legacy_fates;
625 std::tie(legacy_status, legacy_fates) =
626 legacy_hal_.lock()->getRxPktFates(ifname_);
627 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
628 return {createWifiStatusFromLegacyError(legacy_status), {}};
629 }
630 std::vector<WifiDebugRxPacketFateReport> hidl_fates;
631 if (!hidl_struct_util::convertLegacyVectorOfDebugRxPacketFateToHidl(
632 legacy_fates, &hidl_fates)) {
633 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
634 }
635 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_fates};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700636}
637
Jong Wook Kimb9f0ff92018-03-16 16:21:49 -0700638WifiStatus WifiStaIface::setMacAddressInternal(
639 const std::array<uint8_t, 6>& mac) {
Roshan Pius99dab382019-02-14 07:57:10 -0800640 bool status = iface_util_.lock()->setMacAddress(ifname_, mac);
641 if (!status) {
Jong Wook Kimb9f0ff92018-03-16 16:21:49 -0700642 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
643 }
Jong Wook Kimb9f0ff92018-03-16 16:21:49 -0700644 return createWifiStatus(WifiStatusCode::SUCCESS);
645}
646
Jong Wook Kim0ee77432018-08-08 18:57:26 -0700647std::pair<WifiStatus, std::array<uint8_t, 6>>
648WifiStaIface::getFactoryMacAddressInternal() {
649 std::array<uint8_t, 6> mac =
Roshan Pius99dab382019-02-14 07:57:10 -0800650 iface_util_.lock()->getFactoryMacAddress(ifname_);
Jong Wook Kim0ee77432018-08-08 18:57:26 -0700651 return {createWifiStatus(WifiStatusCode::SUCCESS), mac};
652}
653
Roshan Pius3e2d6712016-10-06 13:16:23 -0700654} // namespace implementation
Jimmy Chend460df32019-11-29 17:31:22 +0200655} // namespace V1_5
Roshan Pius3e2d6712016-10-06 13:16:23 -0700656} // namespace wifi
657} // namespace hardware
658} // namespace android