blob: f852d366892b5d52f8314ce50e12460daaea328a [file] [log] [blame]
Ahmed ElArabawy687ce132022-01-11 16:42:48 -08001/*
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
17#include <android-base/logging.h>
18
19#include "hidl_return_util.h"
20#include "hidl_struct_util.h"
21#include "wifi_sta_iface.h"
22#include "wifi_status_util.h"
23
24namespace android {
25namespace hardware {
26namespace wifi {
27namespace V1_6 {
28namespace implementation {
29using hidl_return_util::validateAndCall;
30
31WifiStaIface::WifiStaIface(const std::string& ifname,
32 const std::weak_ptr<legacy_hal::WifiLegacyHal> legacy_hal,
33 const std::weak_ptr<iface_util::WifiIfaceUtil> iface_util)
34 : ifname_(ifname), legacy_hal_(legacy_hal), iface_util_(iface_util), is_valid_(true) {
35 // Turn on DFS channel usage for STA iface.
36 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->setDfsFlag(ifname_, true);
37 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
38 LOG(ERROR) << "Failed to set DFS flag; DFS channels may be unavailable.";
39 }
40}
41
42void WifiStaIface::invalidate() {
43 legacy_hal_.reset();
44 event_cb_handler_.invalidate();
45 is_valid_ = false;
46}
47
48bool WifiStaIface::isValid() {
49 return is_valid_;
50}
51
52std::string WifiStaIface::getName() {
53 return ifname_;
54}
55
56std::set<sp<IWifiStaIfaceEventCallback>> WifiStaIface::getEventCallbacks() {
57 return event_cb_handler_.getCallbacks();
58}
59
60Return<void> WifiStaIface::getName(getName_cb hidl_status_cb) {
61 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
62 &WifiStaIface::getNameInternal, hidl_status_cb);
63}
64
65Return<void> WifiStaIface::getType(getType_cb hidl_status_cb) {
66 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
67 &WifiStaIface::getTypeInternal, hidl_status_cb);
68}
69
70Return<void> WifiStaIface::registerEventCallback(const sp<IWifiStaIfaceEventCallback>& callback,
71 registerEventCallback_cb hidl_status_cb) {
72 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
73 &WifiStaIface::registerEventCallbackInternal, hidl_status_cb, callback);
74}
75
76Return<void> WifiStaIface::getCapabilities(getCapabilities_cb hidl_status_cb) {
77 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
78 &WifiStaIface::getCapabilitiesInternal, hidl_status_cb);
79}
80
81Return<void> WifiStaIface::getApfPacketFilterCapabilities(
82 getApfPacketFilterCapabilities_cb hidl_status_cb) {
83 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
84 &WifiStaIface::getApfPacketFilterCapabilitiesInternal, hidl_status_cb);
85}
86
87Return<void> WifiStaIface::installApfPacketFilter(uint32_t cmd_id, const hidl_vec<uint8_t>& program,
88 installApfPacketFilter_cb hidl_status_cb) {
89 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
90 &WifiStaIface::installApfPacketFilterInternal, hidl_status_cb, cmd_id,
91 program);
92}
93
94Return<void> WifiStaIface::readApfPacketFilterData(readApfPacketFilterData_cb hidl_status_cb) {
95 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
96 &WifiStaIface::readApfPacketFilterDataInternal, hidl_status_cb);
97}
98
99Return<void> WifiStaIface::getBackgroundScanCapabilities(
100 getBackgroundScanCapabilities_cb hidl_status_cb) {
101 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
102 &WifiStaIface::getBackgroundScanCapabilitiesInternal, hidl_status_cb);
103}
104
105Return<void> WifiStaIface::getValidFrequenciesForBand(
106 V1_0::WifiBand band, getValidFrequenciesForBand_cb hidl_status_cb) {
107 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
108 &WifiStaIface::getValidFrequenciesForBandInternal, hidl_status_cb, band);
109}
110
111Return<void> WifiStaIface::startBackgroundScan(uint32_t cmd_id,
112 const StaBackgroundScanParameters& params,
113 startBackgroundScan_cb hidl_status_cb) {
114 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
115 &WifiStaIface::startBackgroundScanInternal, hidl_status_cb, cmd_id,
116 params);
117}
118
119Return<void> WifiStaIface::stopBackgroundScan(uint32_t cmd_id,
120 stopBackgroundScan_cb hidl_status_cb) {
121 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
122 &WifiStaIface::stopBackgroundScanInternal, hidl_status_cb, cmd_id);
123}
124
125Return<void> WifiStaIface::enableLinkLayerStatsCollection(
126 bool debug, enableLinkLayerStatsCollection_cb hidl_status_cb) {
127 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
128 &WifiStaIface::enableLinkLayerStatsCollectionInternal, hidl_status_cb,
129 debug);
130}
131
132Return<void> WifiStaIface::disableLinkLayerStatsCollection(
133 disableLinkLayerStatsCollection_cb hidl_status_cb) {
134 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
135 &WifiStaIface::disableLinkLayerStatsCollectionInternal, hidl_status_cb);
136}
137
138Return<void> WifiStaIface::getLinkLayerStats(getLinkLayerStats_cb hidl_status_cb) {
139 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
140 &WifiStaIface::getLinkLayerStatsInternal, hidl_status_cb);
141}
142
143Return<void> WifiStaIface::getLinkLayerStats_1_3(getLinkLayerStats_1_3_cb hidl_status_cb) {
144 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
145 &WifiStaIface::getLinkLayerStatsInternal_1_3, hidl_status_cb);
146}
147
148Return<void> WifiStaIface::getLinkLayerStats_1_5(getLinkLayerStats_1_5_cb hidl_status_cb) {
149 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
150 &WifiStaIface::getLinkLayerStatsInternal_1_5, hidl_status_cb);
151}
152
153Return<void> WifiStaIface::startRssiMonitoring(uint32_t cmd_id, int32_t max_rssi, int32_t min_rssi,
154 startRssiMonitoring_cb hidl_status_cb) {
155 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
156 &WifiStaIface::startRssiMonitoringInternal, hidl_status_cb, cmd_id,
157 max_rssi, min_rssi);
158}
159
160Return<void> WifiStaIface::stopRssiMonitoring(uint32_t cmd_id,
161 stopRssiMonitoring_cb hidl_status_cb) {
162 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
163 &WifiStaIface::stopRssiMonitoringInternal, hidl_status_cb, cmd_id);
164}
165
166Return<void> WifiStaIface::getRoamingCapabilities(getRoamingCapabilities_cb hidl_status_cb) {
167 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
168 &WifiStaIface::getRoamingCapabilitiesInternal, hidl_status_cb);
169}
170
171Return<void> WifiStaIface::configureRoaming(const StaRoamingConfig& config,
172 configureRoaming_cb hidl_status_cb) {
173 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
174 &WifiStaIface::configureRoamingInternal, hidl_status_cb, config);
175}
176
177Return<void> WifiStaIface::setRoamingState(StaRoamingState state,
178 setRoamingState_cb hidl_status_cb) {
179 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
180 &WifiStaIface::setRoamingStateInternal, hidl_status_cb, state);
181}
182
183Return<void> WifiStaIface::enableNdOffload(bool enable, enableNdOffload_cb hidl_status_cb) {
184 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
185 &WifiStaIface::enableNdOffloadInternal, hidl_status_cb, enable);
186}
187
188Return<void> WifiStaIface::startSendingKeepAlivePackets(
189 uint32_t cmd_id, const hidl_vec<uint8_t>& ip_packet_data, uint16_t ether_type,
190 const hidl_array<uint8_t, 6>& src_address, const hidl_array<uint8_t, 6>& dst_address,
191 uint32_t period_in_ms, startSendingKeepAlivePackets_cb hidl_status_cb) {
192 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
193 &WifiStaIface::startSendingKeepAlivePacketsInternal, hidl_status_cb,
194 cmd_id, ip_packet_data, ether_type, src_address, dst_address,
195 period_in_ms);
196}
197
198Return<void> WifiStaIface::stopSendingKeepAlivePackets(
199 uint32_t cmd_id, stopSendingKeepAlivePackets_cb hidl_status_cb) {
200 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
201 &WifiStaIface::stopSendingKeepAlivePacketsInternal, hidl_status_cb,
202 cmd_id);
203}
204
205Return<void> WifiStaIface::setScanningMacOui(const hidl_array<uint8_t, 3>& oui,
206 setScanningMacOui_cb hidl_status_cb) {
207 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
208 &WifiStaIface::setScanningMacOuiInternal, hidl_status_cb, oui);
209}
210
211Return<void> WifiStaIface::startDebugPacketFateMonitoring(
212 startDebugPacketFateMonitoring_cb hidl_status_cb) {
213 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
214 &WifiStaIface::startDebugPacketFateMonitoringInternal, hidl_status_cb);
215}
216
217Return<void> WifiStaIface::getDebugTxPacketFates(getDebugTxPacketFates_cb hidl_status_cb) {
218 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
219 &WifiStaIface::getDebugTxPacketFatesInternal, hidl_status_cb);
220}
221
222Return<void> WifiStaIface::getDebugRxPacketFates(getDebugRxPacketFates_cb hidl_status_cb) {
223 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
224 &WifiStaIface::getDebugRxPacketFatesInternal, hidl_status_cb);
225}
226
227Return<void> WifiStaIface::setMacAddress(const hidl_array<uint8_t, 6>& mac,
228 setMacAddress_cb hidl_status_cb) {
229 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
230 &WifiStaIface::setMacAddressInternal, hidl_status_cb, mac);
231}
232
233Return<void> WifiStaIface::getFactoryMacAddress(getFactoryMacAddress_cb hidl_status_cb) {
234 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
235 &WifiStaIface::getFactoryMacAddressInternal, hidl_status_cb);
236}
237
238Return<void> WifiStaIface::setScanMode(bool enable, setScanMode_cb hidl_status_cb) {
239 return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID,
240 &WifiStaIface::setScanModeInternal, hidl_status_cb, enable);
241}
242
243std::pair<WifiStatus, std::string> WifiStaIface::getNameInternal() {
244 return {createWifiStatus(WifiStatusCode::SUCCESS), ifname_};
245}
246
247std::pair<WifiStatus, IfaceType> WifiStaIface::getTypeInternal() {
248 return {createWifiStatus(WifiStatusCode::SUCCESS), IfaceType::STA};
249}
250
251WifiStatus WifiStaIface::registerEventCallbackInternal(
252 const sp<IWifiStaIfaceEventCallback>& callback) {
253 if (!event_cb_handler_.addCallback(callback)) {
254 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
255 }
256 return createWifiStatus(WifiStatusCode::SUCCESS);
257}
258
259std::pair<WifiStatus, uint32_t> WifiStaIface::getCapabilitiesInternal() {
260 legacy_hal::wifi_error legacy_status;
261 uint64_t legacy_feature_set;
262 std::tie(legacy_status, legacy_feature_set) =
263 legacy_hal_.lock()->getSupportedFeatureSet(ifname_);
264 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
265 return {createWifiStatusFromLegacyError(legacy_status), 0};
266 }
267 uint32_t legacy_logger_feature_set;
268 std::tie(legacy_status, legacy_logger_feature_set) =
269 legacy_hal_.lock()->getLoggerSupportedFeatureSet(ifname_);
270 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
271 // some devices don't support querying logger feature set
272 legacy_logger_feature_set = 0;
273 }
274 uint32_t hidl_caps;
275 if (!hidl_struct_util::convertLegacyFeaturesToHidlStaCapabilities(
276 legacy_feature_set, legacy_logger_feature_set, &hidl_caps)) {
277 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), 0};
278 }
279 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
280}
281
282std::pair<WifiStatus, StaApfPacketFilterCapabilities>
283WifiStaIface::getApfPacketFilterCapabilitiesInternal() {
284 legacy_hal::wifi_error legacy_status;
285 legacy_hal::PacketFilterCapabilities legacy_caps;
286 std::tie(legacy_status, legacy_caps) = legacy_hal_.lock()->getPacketFilterCapabilities(ifname_);
287 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
288 return {createWifiStatusFromLegacyError(legacy_status), {}};
289 }
290 StaApfPacketFilterCapabilities hidl_caps;
291 if (!hidl_struct_util::convertLegacyApfCapabilitiesToHidl(legacy_caps, &hidl_caps)) {
292 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
293 }
294 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
295}
296
297WifiStatus WifiStaIface::installApfPacketFilterInternal(uint32_t /* cmd_id */,
298 const std::vector<uint8_t>& program) {
299 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->setPacketFilter(ifname_, program);
300 return createWifiStatusFromLegacyError(legacy_status);
301}
302
303std::pair<WifiStatus, std::vector<uint8_t>> WifiStaIface::readApfPacketFilterDataInternal() {
304 const std::pair<legacy_hal::wifi_error, std::vector<uint8_t>> legacy_status_and_data =
305 legacy_hal_.lock()->readApfPacketFilterData(ifname_);
306 return {createWifiStatusFromLegacyError(legacy_status_and_data.first),
307 std::move(legacy_status_and_data.second)};
308}
309
310std::pair<WifiStatus, StaBackgroundScanCapabilities>
311WifiStaIface::getBackgroundScanCapabilitiesInternal() {
312 legacy_hal::wifi_error legacy_status;
313 legacy_hal::wifi_gscan_capabilities legacy_caps;
314 std::tie(legacy_status, legacy_caps) = legacy_hal_.lock()->getGscanCapabilities(ifname_);
315 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
316 return {createWifiStatusFromLegacyError(legacy_status), {}};
317 }
318 StaBackgroundScanCapabilities hidl_caps;
319 if (!hidl_struct_util::convertLegacyGscanCapabilitiesToHidl(legacy_caps, &hidl_caps)) {
320 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
321 }
322 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
323}
324
325std::pair<WifiStatus, std::vector<WifiChannelInMhz>>
326WifiStaIface::getValidFrequenciesForBandInternal(V1_0::WifiBand band) {
327 static_assert(sizeof(WifiChannelInMhz) == sizeof(uint32_t), "Size mismatch");
328 legacy_hal::wifi_error legacy_status;
329 std::vector<uint32_t> valid_frequencies;
330 std::tie(legacy_status, valid_frequencies) = legacy_hal_.lock()->getValidFrequenciesForBand(
331 ifname_, hidl_struct_util::convertHidlWifiBandToLegacy(band));
332 return {createWifiStatusFromLegacyError(legacy_status), valid_frequencies};
333}
334
335WifiStatus WifiStaIface::startBackgroundScanInternal(uint32_t cmd_id,
336 const StaBackgroundScanParameters& params) {
337 legacy_hal::wifi_scan_cmd_params legacy_params;
338 if (!hidl_struct_util::convertHidlGscanParamsToLegacy(params, &legacy_params)) {
339 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
340 }
341 android::wp<WifiStaIface> weak_ptr_this(this);
342 const auto& on_failure_callback = [weak_ptr_this](legacy_hal::wifi_request_id id) {
343 const auto shared_ptr_this = weak_ptr_this.promote();
344 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
345 LOG(ERROR) << "Callback invoked on an invalid object";
346 return;
347 }
348 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
349 if (!callback->onBackgroundScanFailure(id).isOk()) {
350 LOG(ERROR) << "Failed to invoke onBackgroundScanFailure callback";
351 }
352 }
353 };
354 const auto& on_results_callback =
355 [weak_ptr_this](legacy_hal::wifi_request_id id,
356 const std::vector<legacy_hal::wifi_cached_scan_results>& results) {
357 const auto shared_ptr_this = weak_ptr_this.promote();
358 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
359 LOG(ERROR) << "Callback invoked on an invalid object";
360 return;
361 }
362 std::vector<StaScanData> hidl_scan_datas;
363 if (!hidl_struct_util::convertLegacyVectorOfCachedGscanResultsToHidl(
364 results, &hidl_scan_datas)) {
365 LOG(ERROR) << "Failed to convert scan results to HIDL structs";
366 return;
367 }
368 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
369 if (!callback->onBackgroundScanResults(id, hidl_scan_datas).isOk()) {
370 LOG(ERROR) << "Failed to invoke onBackgroundScanResults callback";
371 }
372 }
373 };
374 const auto& on_full_result_callback = [weak_ptr_this](
375 legacy_hal::wifi_request_id id,
376 const legacy_hal::wifi_scan_result* result,
377 uint32_t buckets_scanned) {
378 const auto shared_ptr_this = weak_ptr_this.promote();
379 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
380 LOG(ERROR) << "Callback invoked on an invalid object";
381 return;
382 }
383 StaScanResult hidl_scan_result;
384 if (!hidl_struct_util::convertLegacyGscanResultToHidl(*result, true, &hidl_scan_result)) {
385 LOG(ERROR) << "Failed to convert full scan results to HIDL structs";
386 return;
387 }
388 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
389 if (!callback->onBackgroundFullScanResult(id, buckets_scanned, hidl_scan_result)
390 .isOk()) {
391 LOG(ERROR) << "Failed to invoke onBackgroundFullScanResult callback";
392 }
393 }
394 };
395 legacy_hal::wifi_error legacy_status =
396 legacy_hal_.lock()->startGscan(ifname_, cmd_id, legacy_params, on_failure_callback,
397 on_results_callback, on_full_result_callback);
398 return createWifiStatusFromLegacyError(legacy_status);
399}
400
401WifiStatus WifiStaIface::stopBackgroundScanInternal(uint32_t cmd_id) {
402 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->stopGscan(ifname_, cmd_id);
403 return createWifiStatusFromLegacyError(legacy_status);
404}
405
406WifiStatus WifiStaIface::enableLinkLayerStatsCollectionInternal(bool debug) {
407 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->enableLinkLayerStats(ifname_, debug);
408 return createWifiStatusFromLegacyError(legacy_status);
409}
410
411WifiStatus WifiStaIface::disableLinkLayerStatsCollectionInternal() {
412 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->disableLinkLayerStats(ifname_);
413 return createWifiStatusFromLegacyError(legacy_status);
414}
415
416std::pair<WifiStatus, V1_0::StaLinkLayerStats> WifiStaIface::getLinkLayerStatsInternal() {
417 return {createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED), {}};
418}
419
420std::pair<WifiStatus, V1_3::StaLinkLayerStats> WifiStaIface::getLinkLayerStatsInternal_1_3() {
421 return {createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED), {}};
422}
423
424std::pair<WifiStatus, V1_5::StaLinkLayerStats> WifiStaIface::getLinkLayerStatsInternal_1_5() {
425 legacy_hal::wifi_error legacy_status;
426 legacy_hal::LinkLayerStats legacy_stats;
427 std::tie(legacy_status, legacy_stats) = legacy_hal_.lock()->getLinkLayerStats(ifname_);
428 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
429 return {createWifiStatusFromLegacyError(legacy_status), {}};
430 }
431 V1_5::StaLinkLayerStats hidl_stats;
432 if (!hidl_struct_util::convertLegacyLinkLayerStatsToHidl(legacy_stats, &hidl_stats)) {
433 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
434 }
435 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_stats};
436}
437
438WifiStatus WifiStaIface::startRssiMonitoringInternal(uint32_t cmd_id, int32_t max_rssi,
439 int32_t min_rssi) {
440 android::wp<WifiStaIface> weak_ptr_this(this);
441 const auto& on_threshold_breached_callback = [weak_ptr_this](legacy_hal::wifi_request_id id,
442 std::array<uint8_t, 6> bssid,
443 int8_t rssi) {
444 const auto shared_ptr_this = weak_ptr_this.promote();
445 if (!shared_ptr_this.get() || !shared_ptr_this->isValid()) {
446 LOG(ERROR) << "Callback invoked on an invalid object";
447 return;
448 }
449 for (const auto& callback : shared_ptr_this->getEventCallbacks()) {
450 if (!callback->onRssiThresholdBreached(id, bssid, rssi).isOk()) {
451 LOG(ERROR) << "Failed to invoke onRssiThresholdBreached callback";
452 }
453 }
454 };
455 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->startRssiMonitoring(
456 ifname_, cmd_id, max_rssi, min_rssi, on_threshold_breached_callback);
457 return createWifiStatusFromLegacyError(legacy_status);
458}
459
460WifiStatus WifiStaIface::stopRssiMonitoringInternal(uint32_t cmd_id) {
461 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->stopRssiMonitoring(ifname_, cmd_id);
462 return createWifiStatusFromLegacyError(legacy_status);
463}
464
465std::pair<WifiStatus, StaRoamingCapabilities> WifiStaIface::getRoamingCapabilitiesInternal() {
466 legacy_hal::wifi_error legacy_status;
467 legacy_hal::wifi_roaming_capabilities legacy_caps;
468 std::tie(legacy_status, legacy_caps) = legacy_hal_.lock()->getRoamingCapabilities(ifname_);
469 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
470 return {createWifiStatusFromLegacyError(legacy_status), {}};
471 }
472 StaRoamingCapabilities hidl_caps;
473 if (!hidl_struct_util::convertLegacyRoamingCapabilitiesToHidl(legacy_caps, &hidl_caps)) {
474 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
475 }
476 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps};
477}
478
479WifiStatus WifiStaIface::configureRoamingInternal(const StaRoamingConfig& config) {
480 legacy_hal::wifi_roaming_config legacy_config;
481 if (!hidl_struct_util::convertHidlRoamingConfigToLegacy(config, &legacy_config)) {
482 return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
483 }
484 legacy_hal::wifi_error legacy_status =
485 legacy_hal_.lock()->configureRoaming(ifname_, legacy_config);
486 return createWifiStatusFromLegacyError(legacy_status);
487}
488
489WifiStatus WifiStaIface::setRoamingStateInternal(StaRoamingState state) {
490 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->enableFirmwareRoaming(
491 ifname_, hidl_struct_util::convertHidlRoamingStateToLegacy(state));
492 return createWifiStatusFromLegacyError(legacy_status);
493}
494
495WifiStatus WifiStaIface::enableNdOffloadInternal(bool enable) {
496 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->configureNdOffload(ifname_, enable);
497 return createWifiStatusFromLegacyError(legacy_status);
498}
499
500WifiStatus WifiStaIface::startSendingKeepAlivePacketsInternal(
501 uint32_t cmd_id, const std::vector<uint8_t>& ip_packet_data, uint16_t ether_type,
502 const std::array<uint8_t, 6>& src_address, const std::array<uint8_t, 6>& dst_address,
503 uint32_t period_in_ms) {
504 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->startSendingOffloadedPacket(
505 ifname_, cmd_id, ether_type, ip_packet_data, src_address, dst_address, period_in_ms);
506 return createWifiStatusFromLegacyError(legacy_status);
507}
508
509WifiStatus WifiStaIface::stopSendingKeepAlivePacketsInternal(uint32_t cmd_id) {
510 legacy_hal::wifi_error legacy_status =
511 legacy_hal_.lock()->stopSendingOffloadedPacket(ifname_, cmd_id);
512 return createWifiStatusFromLegacyError(legacy_status);
513}
514
515WifiStatus WifiStaIface::setScanningMacOuiInternal(const std::array<uint8_t, 3>& /* oui */) {
516 // deprecated.
517 return createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED);
518}
519
520WifiStatus WifiStaIface::startDebugPacketFateMonitoringInternal() {
521 legacy_hal::wifi_error legacy_status = legacy_hal_.lock()->startPktFateMonitoring(ifname_);
522 return createWifiStatusFromLegacyError(legacy_status);
523}
524
525std::pair<WifiStatus, std::vector<WifiDebugTxPacketFateReport>>
526WifiStaIface::getDebugTxPacketFatesInternal() {
527 legacy_hal::wifi_error legacy_status;
528 std::vector<legacy_hal::wifi_tx_report> legacy_fates;
529 std::tie(legacy_status, legacy_fates) = legacy_hal_.lock()->getTxPktFates(ifname_);
530 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
531 return {createWifiStatusFromLegacyError(legacy_status), {}};
532 }
533 std::vector<WifiDebugTxPacketFateReport> hidl_fates;
534 if (!hidl_struct_util::convertLegacyVectorOfDebugTxPacketFateToHidl(legacy_fates,
535 &hidl_fates)) {
536 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
537 }
538 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_fates};
539}
540
541std::pair<WifiStatus, std::vector<WifiDebugRxPacketFateReport>>
542WifiStaIface::getDebugRxPacketFatesInternal() {
543 legacy_hal::wifi_error legacy_status;
544 std::vector<legacy_hal::wifi_rx_report> legacy_fates;
545 std::tie(legacy_status, legacy_fates) = legacy_hal_.lock()->getRxPktFates(ifname_);
546 if (legacy_status != legacy_hal::WIFI_SUCCESS) {
547 return {createWifiStatusFromLegacyError(legacy_status), {}};
548 }
549 std::vector<WifiDebugRxPacketFateReport> hidl_fates;
550 if (!hidl_struct_util::convertLegacyVectorOfDebugRxPacketFateToHidl(legacy_fates,
551 &hidl_fates)) {
552 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), {}};
553 }
554 return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_fates};
555}
556
557WifiStatus WifiStaIface::setMacAddressInternal(const std::array<uint8_t, 6>& mac) {
558 bool status = iface_util_.lock()->setMacAddress(ifname_, mac);
559 if (!status) {
560 return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN);
561 }
562 return createWifiStatus(WifiStatusCode::SUCCESS);
563}
564
565std::pair<WifiStatus, std::array<uint8_t, 6>> WifiStaIface::getFactoryMacAddressInternal() {
566 std::array<uint8_t, 6> mac = iface_util_.lock()->getFactoryMacAddress(ifname_);
567 if (mac[0] == 0 && mac[1] == 0 && mac[2] == 0 && mac[3] == 0 && mac[4] == 0 && mac[5] == 0) {
568 return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), mac};
569 }
570 return {createWifiStatus(WifiStatusCode::SUCCESS), mac};
571}
572
573WifiStatus WifiStaIface::setScanModeInternal(bool enable) {
574 // OEM's need to implement this on their devices if needed.
575 LOG(WARNING) << "setScanModeInternal(" << enable << ") not supported";
576 return createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED);
577}
578
579} // namespace implementation
580} // namespace V1_6
581} // namespace wifi
582} // namespace hardware
583} // namespace android