blob: 611da94351bf63a9e15fc9a6ea100d45fb77e1ff [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 {
27namespace V1_0 {
28namespace 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,
33 const std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal)
Roshan Pius3e2d6712016-10-06 13:16:23 -070034 : ifname_(ifname), legacy_hal_(legacy_hal), is_valid_(true) {}
35
36void WifiStaIface::invalidate() {
37 legacy_hal_.reset();
Roshan Piusd37341f2017-01-31 13:13:28 -080038 event_cb_handler_.invalidate();
Roshan Pius3e2d6712016-10-06 13:16:23 -070039 is_valid_ = false;
40}
41
Roshan Pius907d4a22016-10-27 12:48:12 -070042bool WifiStaIface::isValid() {
43 return is_valid_;
44}
45
Roshan Piusd37341f2017-01-31 13:13:28 -080046std::set<sp<IWifiStaIfaceEventCallback>> WifiStaIface::getEventCallbacks() {
47 return event_cb_handler_.getCallbacks();
Roshan Pius970f0312016-12-05 15:25:51 -080048}
49
Roshan Pius734fea02016-10-11 08:30:28 -070050Return<void> WifiStaIface::getName(getName_cb hidl_status_cb) {
Roshan Pius907d4a22016-10-27 12:48:12 -070051 return validateAndCall(this,
52 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
53 &WifiStaIface::getNameInternal,
54 hidl_status_cb);
Roshan Pius3e2d6712016-10-06 13:16:23 -070055}
56
Roshan Pius734fea02016-10-11 08:30:28 -070057Return<void> WifiStaIface::getType(getType_cb hidl_status_cb) {
Roshan Pius907d4a22016-10-27 12:48:12 -070058 return validateAndCall(this,
59 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
60 &WifiStaIface::getTypeInternal,
61 hidl_status_cb);
62}
63
Roshan Piusa04ba3f2016-10-27 14:36:26 -070064Return<void> WifiStaIface::registerEventCallback(
65 const sp<IWifiStaIfaceEventCallback>& callback,
66 registerEventCallback_cb hidl_status_cb) {
67 return validateAndCall(this,
68 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
69 &WifiStaIface::registerEventCallbackInternal,
70 hidl_status_cb,
71 callback);
72}
73
74Return<void> WifiStaIface::getCapabilities(getCapabilities_cb hidl_status_cb) {
75 return validateAndCall(this,
76 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
77 &WifiStaIface::getCapabilitiesInternal,
78 hidl_status_cb);
79}
80
81Return<void> WifiStaIface::getApfPacketFilterCapabilities(
82 getApfPacketFilterCapabilities_cb hidl_status_cb) {
83 return validateAndCall(this,
84 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
85 &WifiStaIface::getApfPacketFilterCapabilitiesInternal,
86 hidl_status_cb);
87}
88
89Return<void> WifiStaIface::installApfPacketFilter(
90 uint32_t cmd_id,
91 const hidl_vec<uint8_t>& program,
92 installApfPacketFilter_cb hidl_status_cb) {
93 return validateAndCall(this,
94 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
95 &WifiStaIface::installApfPacketFilterInternal,
96 hidl_status_cb,
97 cmd_id,
98 program);
99}
100
101Return<void> WifiStaIface::getBackgroundScanCapabilities(
102 getBackgroundScanCapabilities_cb hidl_status_cb) {
103 return validateAndCall(this,
104 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
105 &WifiStaIface::getBackgroundScanCapabilitiesInternal,
106 hidl_status_cb);
107}
108
Roshan Pius7f4574d2017-02-22 09:48:03 -0800109Return<void> WifiStaIface::getValidFrequenciesForBand(
110 WifiBand band, getValidFrequenciesForBand_cb hidl_status_cb) {
111 return validateAndCall(this,
112 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
113 &WifiStaIface::getValidFrequenciesForBandInternal,
114 hidl_status_cb,
115 band);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700116}
117
118Return<void> WifiStaIface::startBackgroundScan(
119 uint32_t cmd_id,
120 const StaBackgroundScanParameters& params,
121 startBackgroundScan_cb hidl_status_cb) {
122 return validateAndCall(this,
123 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
124 &WifiStaIface::startBackgroundScanInternal,
125 hidl_status_cb,
126 cmd_id,
127 params);
128}
129
130Return<void> WifiStaIface::stopBackgroundScan(
131 uint32_t cmd_id, stopBackgroundScan_cb hidl_status_cb) {
132 return validateAndCall(this,
133 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
134 &WifiStaIface::stopBackgroundScanInternal,
135 hidl_status_cb,
136 cmd_id);
137}
138
139Return<void> WifiStaIface::enableLinkLayerStatsCollection(
140 bool debug, enableLinkLayerStatsCollection_cb hidl_status_cb) {
141 return validateAndCall(this,
142 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
143 &WifiStaIface::enableLinkLayerStatsCollectionInternal,
144 hidl_status_cb,
145 debug);
146}
147
148Return<void> WifiStaIface::disableLinkLayerStatsCollection(
149 disableLinkLayerStatsCollection_cb hidl_status_cb) {
150 return validateAndCall(this,
151 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
152 &WifiStaIface::disableLinkLayerStatsCollectionInternal,
153 hidl_status_cb);
154}
155
156Return<void> WifiStaIface::getLinkLayerStats(
157 getLinkLayerStats_cb hidl_status_cb) {
158 return validateAndCall(this,
159 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
160 &WifiStaIface::getLinkLayerStatsInternal,
161 hidl_status_cb);
162}
163
Roshan Piusd4767542016-12-06 10:04:05 -0800164Return<void> WifiStaIface::startRssiMonitoring(
165 uint32_t cmd_id,
166 int32_t max_rssi,
167 int32_t min_rssi,
168 startRssiMonitoring_cb hidl_status_cb) {
169 return validateAndCall(this,
170 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
171 &WifiStaIface::startRssiMonitoringInternal,
172 hidl_status_cb,
173 cmd_id,
174 max_rssi,
175 min_rssi);
176}
177
178Return<void> WifiStaIface::stopRssiMonitoring(
179 uint32_t cmd_id, stopRssiMonitoring_cb hidl_status_cb) {
180 return validateAndCall(this,
181 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
182 &WifiStaIface::stopRssiMonitoringInternal,
183 hidl_status_cb,
184 cmd_id);
185}
186
Roshan Pius26801cb2016-12-13 14:25:45 -0800187Return<void> WifiStaIface::getRoamingCapabilities(
188 getRoamingCapabilities_cb hidl_status_cb) {
189 return validateAndCall(this,
190 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
191 &WifiStaIface::getRoamingCapabilitiesInternal,
192 hidl_status_cb);
193}
194
195Return<void> WifiStaIface::configureRoaming(
196 const StaRoamingConfig& config, configureRoaming_cb hidl_status_cb) {
197 return validateAndCall(this,
198 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
199 &WifiStaIface::configureRoamingInternal,
200 hidl_status_cb,
201 config);
202}
203
204Return<void> WifiStaIface::setRoamingState(StaRoamingState state,
205 setRoamingState_cb hidl_status_cb) {
206 return validateAndCall(this,
207 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
208 &WifiStaIface::setRoamingStateInternal,
209 hidl_status_cb,
210 state);
211}
212
Roshan Piusaf727c02017-01-11 15:37:25 -0800213Return<void> WifiStaIface::enableNdOffload(bool enable,
214 enableNdOffload_cb hidl_status_cb) {
215 return validateAndCall(this,
216 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
217 &WifiStaIface::enableNdOffloadInternal,
218 hidl_status_cb,
219 enable);
220}
221
Roshan Pius9a9869a2017-01-11 16:42:16 -0800222Return<void> WifiStaIface::startSendingKeepAlivePackets(
223 uint32_t cmd_id,
224 const hidl_vec<uint8_t>& ip_packet_data,
225 uint16_t ether_type,
226 const hidl_array<uint8_t, 6>& src_address,
227 const hidl_array<uint8_t, 6>& dst_address,
228 uint32_t period_in_ms,
229 startSendingKeepAlivePackets_cb hidl_status_cb) {
230 return validateAndCall(this,
231 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
232 &WifiStaIface::startSendingKeepAlivePacketsInternal,
233 hidl_status_cb,
234 cmd_id,
235 ip_packet_data,
236 ether_type,
237 src_address,
238 dst_address,
239 period_in_ms);
240}
241
242Return<void> WifiStaIface::stopSendingKeepAlivePackets(
243 uint32_t cmd_id, stopSendingKeepAlivePackets_cb hidl_status_cb) {
244 return validateAndCall(this,
245 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
246 &WifiStaIface::stopSendingKeepAlivePacketsInternal,
247 hidl_status_cb,
248 cmd_id);
249}
250
Roshan Pius795bb812017-02-01 13:09:08 -0800251Return<void> WifiStaIface::setScanningMacOui(
252 const hidl_array<uint8_t, 3>& oui, setScanningMacOui_cb hidl_status_cb) {
253 return validateAndCall(this,
254 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
255 &WifiStaIface::setScanningMacOuiInternal,
256 hidl_status_cb,
257 oui);
258}
259
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700260Return<void> WifiStaIface::startDebugPacketFateMonitoring(
261 startDebugPacketFateMonitoring_cb hidl_status_cb) {
262 return validateAndCall(this,
263 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
264 &WifiStaIface::startDebugPacketFateMonitoringInternal,
265 hidl_status_cb);
266}
267
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700268Return<void> WifiStaIface::getDebugTxPacketFates(
269 getDebugTxPacketFates_cb hidl_status_cb) {
270 return validateAndCall(this,
271 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
272 &WifiStaIface::getDebugTxPacketFatesInternal,
273 hidl_status_cb);
274}
275
276Return<void> WifiStaIface::getDebugRxPacketFates(
277 getDebugRxPacketFates_cb hidl_status_cb) {
278 return validateAndCall(this,
279 WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
280 &WifiStaIface::getDebugRxPacketFatesInternal,
281 hidl_status_cb);
282}
283
Roshan Pius907d4a22016-10-27 12:48:12 -0700284std::pair<WifiStatus, std::string> WifiStaIface::getNameInternal() {
285 return {createWifiStatus(WifiStatusCode::SUCCESS), ifname_};
286}
287
288std::pair<WifiStatus, IfaceType> WifiStaIface::getTypeInternal() {
289 return {createWifiStatus(WifiStatusCode::SUCCESS), IfaceType::STA};
Roshan Pius3e2d6712016-10-06 13:16:23 -0700290}
291
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700292WifiStatus WifiStaIface::registerEventCallbackInternal(
293 const sp<IWifiStaIfaceEventCallback>& callback) {
Roshan Piusd37341f2017-01-31 13:13:28 -0800294 if (!event_cb_handler_.addCallback(callback)) {
295 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
296 }
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700297 return createWifiStatus(WifiStatusCode::SUCCESS);
298}
299
300std::pair<WifiStatus, uint32_t> WifiStaIface::getCapabilitiesInternal() {
Roshan Pius970f0312016-12-05 15:25:51 -0800301 legacy_hal::wifi_error legacy_status;
302 uint32_t legacy_feature_set;
303 std::tie(legacy_status, legacy_feature_set) =
304 legacy_hal_.lock()->getSupportedFeatureSet();
305 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
306 return {createWifiStatusFromLegacyError(legacy_status), 0};
307 }
308 uint32_t legacy_logger_feature_set;
309 std::tie(legacy_status, legacy_logger_feature_set) =
310 legacy_hal_.lock()->getLoggerSupportedFeatureSet();
311 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
Randy Pandbb31022017-04-20 10:03:41 -0700312 // some devices don't support querying logger feature set
313 legacy_logger_feature_set = 0;
Roshan Pius970f0312016-12-05 15:25:51 -0800314 }
315 uint32_t hidl_caps;
316 if (!hidl_struct_util::convertLegacyFeaturesToHidlStaCapabilities(
317 legacy_feature_set, legacy_logger_feature_set, &hidl_caps)) {
318 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), 0};
319 }
320 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700321}
322
323std::pair<WifiStatus, StaApfPacketFilterCapabilities>
324WifiStaIface::getApfPacketFilterCapabilitiesInternal() {
Roshan Pius970f0312016-12-05 15:25:51 -0800325 legacy_hal::wifi_error legacy_status;
326 legacy_hal::PacketFilterCapabilities legacy_caps;
327 std::tie(legacy_status, legacy_caps) =
328 legacy_hal_.lock()->getPacketFilterCapabilities();
329 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
330 return {createWifiStatusFromLegacyError(legacy_status), {}};
331 }
332 StaApfPacketFilterCapabilities hidl_caps;
333 if (!hidl_struct_util::convertLegacyApfCapabilitiesToHidl(legacy_caps,
334 &hidl_caps)) {
335 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
336 }
337 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700338}
339
340WifiStatus WifiStaIface::installApfPacketFilterInternal(
Roshan Pius970f0312016-12-05 15:25:51 -0800341 uint32_t /* cmd_id */, const std::vector<uint8_t>& program) {
342 legacy_hal::wifi_error legacy_status =
343 legacy_hal_.lock()->setPacketFilter(program);
344 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700345}
346
347std::pair<WifiStatus, StaBackgroundScanCapabilities>
348WifiStaIface::getBackgroundScanCapabilitiesInternal() {
Roshan Pius970f0312016-12-05 15:25:51 -0800349 legacy_hal::wifi_error legacy_status;
350 legacy_hal::wifi_gscan_capabilities legacy_caps;
351 std::tie(legacy_status, legacy_caps) =
352 legacy_hal_.lock()->getGscanCapabilities();
353 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
354 return {createWifiStatusFromLegacyError(legacy_status), {}};
355 }
356 StaBackgroundScanCapabilities hidl_caps;
357 if (!hidl_struct_util::convertLegacyGscanCapabilitiesToHidl(legacy_caps,
358 &hidl_caps)) {
359 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
360 }
361 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700362}
363
364std::pair<WifiStatus, std::vector<WifiChannelInMhz>>
Roshan Pius7f4574d2017-02-22 09:48:03 -0800365WifiStaIface::getValidFrequenciesForBandInternal(WifiBand band) {
Roshan Pius970f0312016-12-05 15:25:51 -0800366 static_assert(sizeof(WifiChannelInMhz) == sizeof(uint32_t), "Size mismatch");
367 legacy_hal::wifi_error legacy_status;
368 std::vector<uint32_t> valid_frequencies;
369 std::tie(legacy_status, valid_frequencies) =
Roshan Pius7f4574d2017-02-22 09:48:03 -0800370 legacy_hal_.lock()->getValidFrequenciesForBand(
371 hidl_struct_util::convertHidlWifiBandToLegacy(band));
Roshan Pius970f0312016-12-05 15:25:51 -0800372 return {createWifiStatusFromLegacyError(legacy_status), valid_frequencies};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700373}
374
375WifiStatus WifiStaIface::startBackgroundScanInternal(
Roshan Pius970f0312016-12-05 15:25:51 -0800376 uint32_t cmd_id, const StaBackgroundScanParameters& params) {
377 legacy_hal::wifi_scan_cmd_params legacy_params;
378 if (!hidl_struct_util::convertHidlGscanParamsToLegacy(params,
379 &legacy_params)) {
380 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
381 }
382 android::wp<WifiStaIface> weak_ptr_this(this);
383 const auto& on_failure_callback =
384 [weak_ptr_this](legacy_hal::wifi_request_id id) {
385 const auto shared_ptr_this = weak_ptr_this.promote();
386 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
387 LOG(ERROR) << "Callback invoked on an invalid object";
388 return;
389 }
390 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800391 if (!callback->onBackgroundScanFailure(id).isOk()) {
392 LOG(ERROR) << "Failed to invoke onBackgroundScanFailure callback";
393 }
Roshan Pius970f0312016-12-05 15:25:51 -0800394 }
395 };
396 const auto& on_results_callback = [weak_ptr_this](
397 legacy_hal::wifi_request_id id,
398 const std::vector<legacy_hal::wifi_cached_scan_results>& results) {
399 const auto shared_ptr_this = weak_ptr_this.promote();
400 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
401 LOG(ERROR) << "Callback invoked on an invalid object";
402 return;
403 }
404 std::vector<StaScanData> hidl_scan_datas;
405 if (!hidl_struct_util::convertLegacyVectorOfCachedGscanResultsToHidl(
406 results, &hidl_scan_datas)) {
407 LOG(ERROR) << "Failed to convert scan results to HIDL structs";
408 return;
409 }
410 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800411 if (!callback->onBackgroundScanResults(id, hidl_scan_datas).isOk()) {
412 LOG(ERROR) << "Failed to invoke onBackgroundScanResults callback";
413 }
Roshan Pius970f0312016-12-05 15:25:51 -0800414 }
415 };
416 const auto& on_full_result_callback = [weak_ptr_this](
417 legacy_hal::wifi_request_id id,
418 const legacy_hal::wifi_scan_result* result,
Roshan Pius8c0c8e92017-02-24 08:07:42 -0800419 uint32_t buckets_scanned) {
Roshan Pius970f0312016-12-05 15:25:51 -0800420 const auto shared_ptr_this = weak_ptr_this.promote();
421 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
422 LOG(ERROR) << "Callback invoked on an invalid object";
423 return;
424 }
425 StaScanResult hidl_scan_result;
426 if (!hidl_struct_util::convertLegacyGscanResultToHidl(
427 *result, true, &hidl_scan_result)) {
428 LOG(ERROR) << "Failed to convert full scan results to HIDL structs";
429 return;
430 }
431 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Roshan Pius8c0c8e92017-02-24 08:07:42 -0800432 if (!callback->onBackgroundFullScanResult(
433 id, buckets_scanned, hidl_scan_result).isOk()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800434 LOG(ERROR) << "Failed to invoke onBackgroundFullScanResult callback";
435 }
Roshan Pius970f0312016-12-05 15:25:51 -0800436 }
437 };
438 legacy_hal::wifi_error legacy_status =
439 legacy_hal_.lock()->startGscan(cmd_id,
440 legacy_params,
441 on_failure_callback,
442 on_results_callback,
443 on_full_result_callback);
444 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700445}
446
Roshan Pius970f0312016-12-05 15:25:51 -0800447WifiStatus WifiStaIface::stopBackgroundScanInternal(uint32_t cmd_id) {
448 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->stopGscan(cmd_id);
449 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700450}
451
Roshan Pius970f0312016-12-05 15:25:51 -0800452WifiStatus WifiStaIface::enableLinkLayerStatsCollectionInternal(bool debug) {
453 legacy_hal::wifi_error legacy_status =
454 legacy_hal_.lock()->enableLinkLayerStats(debug);
455 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700456}
457
458WifiStatus WifiStaIface::disableLinkLayerStatsCollectionInternal() {
Roshan Pius970f0312016-12-05 15:25:51 -0800459 legacy_hal::wifi_error legacy_status =
460 legacy_hal_.lock()->disableLinkLayerStats();
461 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700462}
463
464std::pair<WifiStatus, StaLinkLayerStats>
465WifiStaIface::getLinkLayerStatsInternal() {
Roshan Pius970f0312016-12-05 15:25:51 -0800466 legacy_hal::wifi_error legacy_status;
467 legacy_hal::LinkLayerStats legacy_stats;
468 std::tie(legacy_status, legacy_stats) =
469 legacy_hal_.lock()->getLinkLayerStats();
470 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
471 return {createWifiStatusFromLegacyError(legacy_status), {}};
472 }
473 StaLinkLayerStats hidl_stats;
474 if (!hidl_struct_util::convertLegacyLinkLayerStatsToHidl(legacy_stats,
475 &hidl_stats)) {
476 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
477 }
478 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_stats};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700479}
480
Roshan Piusd4767542016-12-06 10:04:05 -0800481WifiStatus WifiStaIface::startRssiMonitoringInternal(uint32_t cmd_id,
482 int32_t max_rssi,
483 int32_t min_rssi) {
484 android::wp<WifiStaIface> weak_ptr_this(this);
485 const auto& on_threshold_breached_callback = [weak_ptr_this](
486 legacy_hal::wifi_request_id id,
487 std::array<uint8_t, 6> bssid,
488 int8_t rssi) {
489 const auto shared_ptr_this = weak_ptr_this.promote();
490 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
491 LOG(ERROR) << "Callback invoked on an invalid object";
492 return;
493 }
494 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
Roshan Piusbc662202017-01-30 17:07:42 -0800495 if (!callback->onRssiThresholdBreached(id, bssid, rssi).isOk()) {
496 LOG(ERROR) << "Failed to invoke onRssiThresholdBreached callback";
497 }
Roshan Piusd4767542016-12-06 10:04:05 -0800498 }
499 };
500 legacy_hal::wifi_error legacy_status =
501 legacy_hal_.lock()->startRssiMonitoring(
502 cmd_id, max_rssi, min_rssi, on_threshold_breached_callback);
503 return createWifiStatusFromLegacyError(legacy_status);
504}
505
506WifiStatus WifiStaIface::stopRssiMonitoringInternal(uint32_t cmd_id) {
507 legacy_hal::wifi_error legacy_status =
508 legacy_hal_.lock()->stopRssiMonitoring(cmd_id);
509 return createWifiStatusFromLegacyError(legacy_status);
510}
511
Roshan Pius26801cb2016-12-13 14:25:45 -0800512std::pair<WifiStatus, StaRoamingCapabilities>
513WifiStaIface::getRoamingCapabilitiesInternal() {
514 legacy_hal::wifi_error legacy_status;
515 legacy_hal::wifi_roaming_capabilities legacy_caps;
516 std::tie(legacy_status, legacy_caps) =
517 legacy_hal_.lock()->getRoamingCapabilities();
518 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
519 return {createWifiStatusFromLegacyError(legacy_status), {}};
520 }
521 StaRoamingCapabilities hidl_caps;
522 if (!hidl_struct_util::convertLegacyRoamingCapabilitiesToHidl(legacy_caps,
523 &hidl_caps)) {
524 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
525 }
526 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
527}
528
529WifiStatus WifiStaIface::configureRoamingInternal(
530 const StaRoamingConfig& config) {
531 legacy_hal::wifi_roaming_config legacy_config;
532 if (!hidl_struct_util::convertHidlRoamingConfigToLegacy(config,
533 &legacy_config)) {
534 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
535 }
536 legacy_hal::wifi_error legacy_status =
537 legacy_hal_.lock()->configureRoaming(legacy_config);
538 return createWifiStatusFromLegacyError(legacy_status);
539}
540
541WifiStatus WifiStaIface::setRoamingStateInternal(StaRoamingState state) {
542 legacy_hal::wifi_error legacy_status =
543 legacy_hal_.lock()->enableFirmwareRoaming(
544 hidl_struct_util::convertHidlRoamingStateToLegacy(state));
545 return createWifiStatusFromLegacyError(legacy_status);
546}
547
Roshan Piusaf727c02017-01-11 15:37:25 -0800548WifiStatus WifiStaIface::enableNdOffloadInternal(bool enable) {
549 legacy_hal::wifi_error legacy_status =
550 legacy_hal_.lock()->configureNdOffload(enable);
551 return createWifiStatusFromLegacyError(legacy_status);
552}
553
Roshan Pius9a9869a2017-01-11 16:42:16 -0800554WifiStatus WifiStaIface::startSendingKeepAlivePacketsInternal(
555 uint32_t cmd_id,
556 const std::vector<uint8_t>& ip_packet_data,
557 uint16_t /* ether_type */,
558 const std::array<uint8_t, 6>& src_address,
559 const std::array<uint8_t, 6>& dst_address,
560 uint32_t period_in_ms) {
561 legacy_hal::wifi_error legacy_status =
562 legacy_hal_.lock()->startSendingOffloadedPacket(
563 cmd_id, ip_packet_data, src_address, dst_address, period_in_ms);
564 return createWifiStatusFromLegacyError(legacy_status);
565}
566
567WifiStatus WifiStaIface::stopSendingKeepAlivePacketsInternal(uint32_t cmd_id) {
568 legacy_hal::wifi_error legacy_status =
569 legacy_hal_.lock()->stopSendingOffloadedPacket(cmd_id);
570 return createWifiStatusFromLegacyError(legacy_status);
571}
572
Roshan Piusd37341f2017-01-31 13:13:28 -0800573WifiStatus WifiStaIface::setScanningMacOuiInternal(
574 const std::array<uint8_t, 3>& oui) {
Roshan Pius795bb812017-02-01 13:09:08 -0800575 legacy_hal::wifi_error legacy_status =
576 legacy_hal_.lock()->setScanningMacOui(oui);
577 return createWifiStatusFromLegacyError(legacy_status);
578}
579
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700580WifiStatus WifiStaIface::startDebugPacketFateMonitoringInternal() {
Roshan Pius970f0312016-12-05 15:25:51 -0800581 legacy_hal::wifi_error legacy_status =
582 legacy_hal_.lock()->startPktFateMonitoring();
583 return createWifiStatusFromLegacyError(legacy_status);
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700584}
585
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700586std::pair<WifiStatus, std::vector<WifiDebugTxPacketFateReport>>
587WifiStaIface::getDebugTxPacketFatesInternal() {
Roshan Pius970f0312016-12-05 15:25:51 -0800588 legacy_hal::wifi_error legacy_status;
589 std::vector<legacy_hal::wifi_tx_report> legacy_fates;
590 std::tie(legacy_status, legacy_fates) = legacy_hal_.lock()->getTxPktFates();
591 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
592 return {createWifiStatusFromLegacyError(legacy_status), {}};
593 }
594 std::vector<WifiDebugTxPacketFateReport> hidl_fates;
595 if (!hidl_struct_util::convertLegacyVectorOfDebugTxPacketFateToHidl(
596 legacy_fates, &hidl_fates)) {
597 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
598 }
599 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_fates};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700600}
601
602std::pair<WifiStatus, std::vector<WifiDebugRxPacketFateReport>>
603WifiStaIface::getDebugRxPacketFatesInternal() {
Roshan Pius970f0312016-12-05 15:25:51 -0800604 legacy_hal::wifi_error legacy_status;
605 std::vector<legacy_hal::wifi_rx_report> legacy_fates;
606 std::tie(legacy_status, legacy_fates) = legacy_hal_.lock()->getRxPktFates();
607 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
608 return {createWifiStatusFromLegacyError(legacy_status), {}};
609 }
610 std::vector<WifiDebugRxPacketFateReport> hidl_fates;
611 if (!hidl_struct_util::convertLegacyVectorOfDebugRxPacketFateToHidl(
612 legacy_fates, &hidl_fates)) {
613 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
614 }
615 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_fates};
Roshan Piusa04ba3f2016-10-27 14:36:26 -0700616}
617
Roshan Pius3e2d6712016-10-06 13:16:23 -0700618} // namespace implementation
619} // namespace V1_0
620} // namespace wifi
621} // namespace hardware
622} // namespace android