blob: c411f296e7aaf75332dc6af9cadc813f6990582e [file] [log] [blame]
Gabriel Birenf3262f92022-07-15 23:25:39 +00001/*
2 * Copyright (C) 2022 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 "wifi_legacy_hal.h"
18
19#include <android-base/logging.h>
20#include <cutils/properties.h>
21#include <net/if.h>
22
23#include <array>
24#include <chrono>
25
26#include "aidl_sync_util.h"
27#include "wifi_legacy_hal_stubs.h"
28
29namespace {
30// Constants ported over from the legacy HAL calling code
31// (com_android_server_wifi_WifiNative.cpp). This will all be thrown
32// away when this shim layer is replaced by the real vendor
33// implementation.
34static constexpr uint32_t kMaxVersionStringLength = 256;
35static constexpr uint32_t kMaxCachedGscanResults = 64;
36static constexpr uint32_t kMaxGscanFrequenciesForBand = 64;
37static constexpr uint32_t kLinkLayerStatsDataMpduSizeThreshold = 128;
38static constexpr uint32_t kMaxWakeReasonStatsArraySize = 32;
39static constexpr uint32_t kMaxRingBuffers = 10;
40static constexpr uint32_t kMaxWifiUsableChannels = 256;
41static constexpr uint32_t kMaxSupportedRadioCombinationsMatrixLength = 256;
42// Need a long timeout (1000ms) for chips that unload their driver.
43static constexpr uint32_t kMaxStopCompleteWaitMs = 1000;
44static constexpr char kDriverPropName[] = "wlan.driver.status";
45
46// Helper function to create a non-const char* for legacy Hal API's.
47std::vector<char> makeCharVec(const std::string& str) {
48 std::vector<char> vec(str.size() + 1);
49 vec.assign(str.begin(), str.end());
50 vec.push_back('\0');
51 return vec;
52}
53} // namespace
54
55namespace aidl {
56namespace android {
57namespace hardware {
58namespace wifi {
59namespace legacy_hal {
60
61// Legacy HAL functions accept "C" style function pointers, so use global
62// functions to pass to the legacy HAL function and store the corresponding
63// std::function methods to be invoked.
64//
65// Callback to be invoked once |stop| is complete
66std::function<void(wifi_handle handle)> on_stop_complete_internal_callback;
67void onAsyncStopComplete(wifi_handle handle) {
68 const auto lock = aidl_sync_util::acquireGlobalLock();
69 if (on_stop_complete_internal_callback) {
70 on_stop_complete_internal_callback(handle);
71 // Invalidate this callback since we don't want this firing again.
72 on_stop_complete_internal_callback = nullptr;
73 }
74}
75
76// Callback to be invoked for driver dump.
77std::function<void(char*, int)> on_driver_memory_dump_internal_callback;
78void onSyncDriverMemoryDump(char* buffer, int buffer_size) {
79 if (on_driver_memory_dump_internal_callback) {
80 on_driver_memory_dump_internal_callback(buffer, buffer_size);
81 }
82}
83
84// Callback to be invoked for firmware dump.
85std::function<void(char*, int)> on_firmware_memory_dump_internal_callback;
86void onSyncFirmwareMemoryDump(char* buffer, int buffer_size) {
87 if (on_firmware_memory_dump_internal_callback) {
88 on_firmware_memory_dump_internal_callback(buffer, buffer_size);
89 }
90}
91
92// Callback to be invoked for Gscan events.
93std::function<void(wifi_request_id, wifi_scan_event)> on_gscan_event_internal_callback;
94void onAsyncGscanEvent(wifi_request_id id, wifi_scan_event event) {
95 const auto lock = aidl_sync_util::acquireGlobalLock();
96 if (on_gscan_event_internal_callback) {
97 on_gscan_event_internal_callback(id, event);
98 }
99}
100
101// Callback to be invoked for Gscan full results.
102std::function<void(wifi_request_id, wifi_scan_result*, uint32_t)>
103 on_gscan_full_result_internal_callback;
104void onAsyncGscanFullResult(wifi_request_id id, wifi_scan_result* result,
105 uint32_t buckets_scanned) {
106 const auto lock = aidl_sync_util::acquireGlobalLock();
107 if (on_gscan_full_result_internal_callback) {
108 on_gscan_full_result_internal_callback(id, result, buckets_scanned);
109 }
110}
111
112// Callback to be invoked for link layer stats results.
113std::function<void((wifi_request_id, wifi_iface_stat*, int, wifi_radio_stat*))>
114 on_link_layer_stats_result_internal_callback;
115void onSyncLinkLayerStatsResult(wifi_request_id id, wifi_iface_stat* iface_stat, int num_radios,
116 wifi_radio_stat* radio_stat) {
117 if (on_link_layer_stats_result_internal_callback) {
118 on_link_layer_stats_result_internal_callback(id, iface_stat, num_radios, radio_stat);
119 }
120}
121
Mahesh KKV5f30d332022-10-26 14:07:44 -0700122// Callback to be invoked for Multi link layer stats results.
123std::function<void((wifi_request_id, wifi_iface_ml_stat*, int, wifi_radio_stat*))>
124 on_link_layer_ml_stats_result_internal_callback;
125void onSyncLinkLayerMlStatsResult(wifi_request_id id, wifi_iface_ml_stat* iface_ml_stat,
126 int num_radios, wifi_radio_stat* radio_stat) {
127 if (on_link_layer_ml_stats_result_internal_callback) {
128 on_link_layer_ml_stats_result_internal_callback(id, iface_ml_stat, num_radios, radio_stat);
129 }
130}
131
Gabriel Birenf3262f92022-07-15 23:25:39 +0000132// Callback to be invoked for rssi threshold breach.
133std::function<void((wifi_request_id, uint8_t*, int8_t))>
134 on_rssi_threshold_breached_internal_callback;
135void onAsyncRssiThresholdBreached(wifi_request_id id, uint8_t* bssid, int8_t rssi) {
136 const auto lock = aidl_sync_util::acquireGlobalLock();
137 if (on_rssi_threshold_breached_internal_callback) {
138 on_rssi_threshold_breached_internal_callback(id, bssid, rssi);
139 }
140}
141
142// Callback to be invoked for ring buffer data indication.
143std::function<void(char*, char*, int, wifi_ring_buffer_status*)>
144 on_ring_buffer_data_internal_callback;
145void onAsyncRingBufferData(char* ring_name, char* buffer, int buffer_size,
146 wifi_ring_buffer_status* status) {
147 const auto lock = aidl_sync_util::acquireGlobalLock();
148 if (on_ring_buffer_data_internal_callback) {
149 on_ring_buffer_data_internal_callback(ring_name, buffer, buffer_size, status);
150 }
151}
152
153// Callback to be invoked for error alert indication.
154std::function<void(wifi_request_id, char*, int, int)> on_error_alert_internal_callback;
155void onAsyncErrorAlert(wifi_request_id id, char* buffer, int buffer_size, int err_code) {
156 const auto lock = aidl_sync_util::acquireGlobalLock();
157 if (on_error_alert_internal_callback) {
158 on_error_alert_internal_callback(id, buffer, buffer_size, err_code);
159 }
160}
161
162// Callback to be invoked for radio mode change indication.
163std::function<void(wifi_request_id, uint32_t, wifi_mac_info*)>
164 on_radio_mode_change_internal_callback;
165void onAsyncRadioModeChange(wifi_request_id id, uint32_t num_macs, wifi_mac_info* mac_infos) {
166 const auto lock = aidl_sync_util::acquireGlobalLock();
167 if (on_radio_mode_change_internal_callback) {
168 on_radio_mode_change_internal_callback(id, num_macs, mac_infos);
169 }
170}
171
172// Callback to be invoked to report subsystem restart
173std::function<void(const char*)> on_subsystem_restart_internal_callback;
174void onAsyncSubsystemRestart(const char* error) {
175 const auto lock = aidl_sync_util::acquireGlobalLock();
176 if (on_subsystem_restart_internal_callback) {
177 on_subsystem_restart_internal_callback(error);
178 }
179}
180
181// Callback to be invoked for rtt results results.
182std::function<void(wifi_request_id, unsigned num_results, wifi_rtt_result* rtt_results[])>
183 on_rtt_results_internal_callback;
Sunil Ravif8fc2372022-11-10 18:37:41 +0000184std::function<void(wifi_request_id, unsigned num_results, wifi_rtt_result_v2* rtt_results_v2[])>
185 on_rtt_results_internal_callback_v2;
maheshkkv7d422812023-11-16 17:32:50 -0800186std::function<void(wifi_request_id, unsigned num_results, wifi_rtt_result_v3* rtt_results_v3[])>
187 on_rtt_results_internal_callback_v3;
Sunil Ravif8fc2372022-11-10 18:37:41 +0000188
189void invalidateRttResultsCallbacks() {
190 on_rtt_results_internal_callback = nullptr;
191 on_rtt_results_internal_callback_v2 = nullptr;
maheshkkv7d422812023-11-16 17:32:50 -0800192 on_rtt_results_internal_callback_v3 = nullptr;
Sunil Ravif8fc2372022-11-10 18:37:41 +0000193};
194
Gabriel Birenf3262f92022-07-15 23:25:39 +0000195void onAsyncRttResults(wifi_request_id id, unsigned num_results, wifi_rtt_result* rtt_results[]) {
196 const auto lock = aidl_sync_util::acquireGlobalLock();
197 if (on_rtt_results_internal_callback) {
198 on_rtt_results_internal_callback(id, num_results, rtt_results);
Sunil Ravif8fc2372022-11-10 18:37:41 +0000199 invalidateRttResultsCallbacks();
200 }
201}
202
203void onAsyncRttResultsV2(wifi_request_id id, unsigned num_results,
204 wifi_rtt_result_v2* rtt_results_v2[]) {
205 const auto lock = aidl_sync_util::acquireGlobalLock();
206 if (on_rtt_results_internal_callback_v2) {
207 on_rtt_results_internal_callback_v2(id, num_results, rtt_results_v2);
208 invalidateRttResultsCallbacks();
Gabriel Birenf3262f92022-07-15 23:25:39 +0000209 }
210}
211
maheshkkv7d422812023-11-16 17:32:50 -0800212void onAsyncRttResultsV3(wifi_request_id id, unsigned num_results,
213 wifi_rtt_result_v3* rtt_results_v3[]) {
214 const auto lock = aidl_sync_util::acquireGlobalLock();
215 if (on_rtt_results_internal_callback_v3) {
216 on_rtt_results_internal_callback_v3(id, num_results, rtt_results_v3);
217 invalidateRttResultsCallbacks();
218 }
219}
220
Gabriel Birenf3262f92022-07-15 23:25:39 +0000221// Callbacks for the various NAN operations.
222// NOTE: These have very little conversions to perform before invoking the user
223// callbacks.
224// So, handle all of them here directly to avoid adding an unnecessary layer.
225std::function<void(transaction_id, const NanResponseMsg&)> on_nan_notify_response_user_callback;
226void onAsyncNanNotifyResponse(transaction_id id, NanResponseMsg* msg) {
227 const auto lock = aidl_sync_util::acquireGlobalLock();
228 if (on_nan_notify_response_user_callback && msg) {
229 on_nan_notify_response_user_callback(id, *msg);
230 }
231}
232
233std::function<void(const NanPublishRepliedInd&)> on_nan_event_publish_replied_user_callback;
234void onAsyncNanEventPublishReplied(NanPublishRepliedInd* /* event */) {
235 LOG(ERROR) << "onAsyncNanEventPublishReplied triggered";
236}
237
238std::function<void(const NanPublishTerminatedInd&)> on_nan_event_publish_terminated_user_callback;
239void onAsyncNanEventPublishTerminated(NanPublishTerminatedInd* event) {
240 const auto lock = aidl_sync_util::acquireGlobalLock();
241 if (on_nan_event_publish_terminated_user_callback && event) {
242 on_nan_event_publish_terminated_user_callback(*event);
243 }
244}
245
246std::function<void(const NanMatchInd&)> on_nan_event_match_user_callback;
247void onAsyncNanEventMatch(NanMatchInd* event) {
248 const auto lock = aidl_sync_util::acquireGlobalLock();
249 if (on_nan_event_match_user_callback && event) {
250 on_nan_event_match_user_callback(*event);
251 }
252}
253
254std::function<void(const NanMatchExpiredInd&)> on_nan_event_match_expired_user_callback;
255void onAsyncNanEventMatchExpired(NanMatchExpiredInd* event) {
256 const auto lock = aidl_sync_util::acquireGlobalLock();
257 if (on_nan_event_match_expired_user_callback && event) {
258 on_nan_event_match_expired_user_callback(*event);
259 }
260}
261
262std::function<void(const NanSubscribeTerminatedInd&)>
263 on_nan_event_subscribe_terminated_user_callback;
264void onAsyncNanEventSubscribeTerminated(NanSubscribeTerminatedInd* event) {
265 const auto lock = aidl_sync_util::acquireGlobalLock();
266 if (on_nan_event_subscribe_terminated_user_callback && event) {
267 on_nan_event_subscribe_terminated_user_callback(*event);
268 }
269}
270
271std::function<void(const NanFollowupInd&)> on_nan_event_followup_user_callback;
272void onAsyncNanEventFollowup(NanFollowupInd* event) {
273 const auto lock = aidl_sync_util::acquireGlobalLock();
274 if (on_nan_event_followup_user_callback && event) {
275 on_nan_event_followup_user_callback(*event);
276 }
277}
278
279std::function<void(const NanDiscEngEventInd&)> on_nan_event_disc_eng_event_user_callback;
280void onAsyncNanEventDiscEngEvent(NanDiscEngEventInd* event) {
281 const auto lock = aidl_sync_util::acquireGlobalLock();
282 if (on_nan_event_disc_eng_event_user_callback && event) {
283 on_nan_event_disc_eng_event_user_callback(*event);
284 }
285}
286
287std::function<void(const NanDisabledInd&)> on_nan_event_disabled_user_callback;
288void onAsyncNanEventDisabled(NanDisabledInd* event) {
289 const auto lock = aidl_sync_util::acquireGlobalLock();
290 if (on_nan_event_disabled_user_callback && event) {
291 on_nan_event_disabled_user_callback(*event);
292 }
293}
294
295std::function<void(const NanTCAInd&)> on_nan_event_tca_user_callback;
296void onAsyncNanEventTca(NanTCAInd* event) {
297 const auto lock = aidl_sync_util::acquireGlobalLock();
298 if (on_nan_event_tca_user_callback && event) {
299 on_nan_event_tca_user_callback(*event);
300 }
301}
302
303std::function<void(const NanBeaconSdfPayloadInd&)> on_nan_event_beacon_sdf_payload_user_callback;
304void onAsyncNanEventBeaconSdfPayload(NanBeaconSdfPayloadInd* event) {
305 const auto lock = aidl_sync_util::acquireGlobalLock();
306 if (on_nan_event_beacon_sdf_payload_user_callback && event) {
307 on_nan_event_beacon_sdf_payload_user_callback(*event);
308 }
309}
310
311std::function<void(const NanDataPathRequestInd&)> on_nan_event_data_path_request_user_callback;
312void onAsyncNanEventDataPathRequest(NanDataPathRequestInd* event) {
313 const auto lock = aidl_sync_util::acquireGlobalLock();
314 if (on_nan_event_data_path_request_user_callback && event) {
315 on_nan_event_data_path_request_user_callback(*event);
316 }
317}
318std::function<void(const NanDataPathConfirmInd&)> on_nan_event_data_path_confirm_user_callback;
319void onAsyncNanEventDataPathConfirm(NanDataPathConfirmInd* event) {
320 const auto lock = aidl_sync_util::acquireGlobalLock();
321 if (on_nan_event_data_path_confirm_user_callback && event) {
322 on_nan_event_data_path_confirm_user_callback(*event);
323 }
324}
325
326std::function<void(const NanDataPathEndInd&)> on_nan_event_data_path_end_user_callback;
327void onAsyncNanEventDataPathEnd(NanDataPathEndInd* event) {
328 const auto lock = aidl_sync_util::acquireGlobalLock();
329 if (on_nan_event_data_path_end_user_callback && event) {
330 on_nan_event_data_path_end_user_callback(*event);
331 }
332}
333
334std::function<void(const NanTransmitFollowupInd&)> on_nan_event_transmit_follow_up_user_callback;
335void onAsyncNanEventTransmitFollowUp(NanTransmitFollowupInd* event) {
336 const auto lock = aidl_sync_util::acquireGlobalLock();
337 if (on_nan_event_transmit_follow_up_user_callback && event) {
338 on_nan_event_transmit_follow_up_user_callback(*event);
339 }
340}
341
342std::function<void(const NanRangeRequestInd&)> on_nan_event_range_request_user_callback;
343void onAsyncNanEventRangeRequest(NanRangeRequestInd* event) {
344 const auto lock = aidl_sync_util::acquireGlobalLock();
345 if (on_nan_event_range_request_user_callback && event) {
346 on_nan_event_range_request_user_callback(*event);
347 }
348}
349
350std::function<void(const NanRangeReportInd&)> on_nan_event_range_report_user_callback;
351void onAsyncNanEventRangeReport(NanRangeReportInd* event) {
352 const auto lock = aidl_sync_util::acquireGlobalLock();
353 if (on_nan_event_range_report_user_callback && event) {
354 on_nan_event_range_report_user_callback(*event);
355 }
356}
357
358std::function<void(const NanDataPathScheduleUpdateInd&)> on_nan_event_schedule_update_user_callback;
359void onAsyncNanEventScheduleUpdate(NanDataPathScheduleUpdateInd* event) {
360 const auto lock = aidl_sync_util::acquireGlobalLock();
361 if (on_nan_event_schedule_update_user_callback && event) {
362 on_nan_event_schedule_update_user_callback(*event);
363 }
364}
365
Nate Jiangd6cc3312023-02-14 16:37:54 -0800366std::function<void(const NanSuspensionModeChangeInd&)>
367 on_nan_event_suspension_mode_change_user_callback;
368void onAsyncNanEventSuspensionModeChange(NanSuspensionModeChangeInd* event) {
369 const auto lock = aidl_sync_util::acquireGlobalLock();
370 if (on_nan_event_suspension_mode_change_user_callback && event) {
371 on_nan_event_suspension_mode_change_user_callback(*event);
372 }
373}
374
Nate Jiang38e8db52022-12-02 17:30:27 -0800375std::function<void(const NanPairingRequestInd&)> on_nan_event_pairing_request_user_callback;
376void onAsyncNanEventPairingRequest(NanPairingRequestInd* event) {
377 const auto lock = aidl_sync_util::acquireGlobalLock();
378 if (on_nan_event_pairing_request_user_callback && event) {
379 on_nan_event_pairing_request_user_callback(*event);
380 }
381}
382
383std::function<void(const NanPairingConfirmInd&)> on_nan_event_pairing_confirm_user_callback;
384void onAsyncNanEventPairingConfirm(NanPairingConfirmInd* event) {
385 const auto lock = aidl_sync_util::acquireGlobalLock();
386 if (on_nan_event_pairing_confirm_user_callback && event) {
387 on_nan_event_pairing_confirm_user_callback(*event);
388 }
389}
390
391std::function<void(const NanBootstrappingRequestInd&)>
392 on_nan_event_bootstrapping_request_user_callback;
393void onAsyncNanEventBootstrappingRequest(NanBootstrappingRequestInd* event) {
394 const auto lock = aidl_sync_util::acquireGlobalLock();
395 if (on_nan_event_bootstrapping_request_user_callback && event) {
396 on_nan_event_bootstrapping_request_user_callback(*event);
397 }
398}
399
400std::function<void(const NanBootstrappingConfirmInd&)>
401 on_nan_event_bootstrapping_confirm_user_callback;
402void onAsyncNanEventBootstrappingConfirm(NanBootstrappingConfirmInd* event) {
403 const auto lock = aidl_sync_util::acquireGlobalLock();
404 if (on_nan_event_bootstrapping_confirm_user_callback && event) {
405 on_nan_event_bootstrapping_confirm_user_callback(*event);
406 }
407}
408
Gabriel Birenf3262f92022-07-15 23:25:39 +0000409// Callbacks for the various TWT operations.
410std::function<void(const TwtSetupResponse&)> on_twt_event_setup_response_callback;
411void onAsyncTwtEventSetupResponse(TwtSetupResponse* event) {
412 const auto lock = aidl_sync_util::acquireGlobalLock();
413 if (on_twt_event_setup_response_callback && event) {
414 on_twt_event_setup_response_callback(*event);
415 }
416}
417
418std::function<void(const TwtTeardownCompletion&)> on_twt_event_teardown_completion_callback;
419void onAsyncTwtEventTeardownCompletion(TwtTeardownCompletion* event) {
420 const auto lock = aidl_sync_util::acquireGlobalLock();
421 if (on_twt_event_teardown_completion_callback && event) {
422 on_twt_event_teardown_completion_callback(*event);
423 }
424}
425
426std::function<void(const TwtInfoFrameReceived&)> on_twt_event_info_frame_received_callback;
427void onAsyncTwtEventInfoFrameReceived(TwtInfoFrameReceived* event) {
428 const auto lock = aidl_sync_util::acquireGlobalLock();
429 if (on_twt_event_info_frame_received_callback && event) {
430 on_twt_event_info_frame_received_callback(*event);
431 }
432}
433
434std::function<void(const TwtDeviceNotify&)> on_twt_event_device_notify_callback;
435void onAsyncTwtEventDeviceNotify(TwtDeviceNotify* event) {
436 const auto lock = aidl_sync_util::acquireGlobalLock();
437 if (on_twt_event_device_notify_callback && event) {
438 on_twt_event_device_notify_callback(*event);
439 }
440}
441
442// Callback to report current CHRE NAN state
443std::function<void(chre_nan_rtt_state)> on_chre_nan_rtt_internal_callback;
444void onAsyncChreNanRttState(chre_nan_rtt_state state) {
445 const auto lock = aidl_sync_util::acquireGlobalLock();
446 if (on_chre_nan_rtt_internal_callback) {
447 on_chre_nan_rtt_internal_callback(state);
448 }
449}
450
451// Callback to report cached scan results
452std::function<void(wifi_cached_scan_report*)> on_cached_scan_results_internal_callback;
453void onSyncCachedScanResults(wifi_cached_scan_report* cache_report) {
454 if (on_cached_scan_results_internal_callback) {
455 on_cached_scan_results_internal_callback(cache_report);
456 }
457}
458
459// End of the free-standing "C" style callbacks.
460
461WifiLegacyHal::WifiLegacyHal(const std::weak_ptr<::android::wifi_system::InterfaceTool> iface_tool,
462 const wifi_hal_fn& fn, bool is_primary)
463 : global_func_table_(fn),
464 global_handle_(nullptr),
465 awaiting_event_loop_termination_(false),
466 is_started_(false),
467 iface_tool_(iface_tool),
468 is_primary_(is_primary) {}
469
470wifi_error WifiLegacyHal::initialize() {
471 LOG(DEBUG) << "Initialize legacy HAL";
472 // this now does nothing, since HAL function table is provided
473 // to the constructor
474 return WIFI_SUCCESS;
475}
476
477wifi_error WifiLegacyHal::start() {
478 // Ensure that we're starting in a good state.
479 CHECK(global_func_table_.wifi_initialize && !global_handle_ && iface_name_to_handle_.empty() &&
480 !awaiting_event_loop_termination_);
481 if (is_started_) {
482 LOG(DEBUG) << "Legacy HAL already started";
483 return WIFI_SUCCESS;
484 }
485 LOG(DEBUG) << "Waiting for the driver ready";
486 wifi_error status = global_func_table_.wifi_wait_for_driver_ready();
487 if (status == WIFI_ERROR_TIMED_OUT || status == WIFI_ERROR_UNKNOWN) {
488 LOG(ERROR) << "Failed or timed out awaiting driver ready";
489 return status;
490 }
491
492 if (is_primary_) {
493 property_set(kDriverPropName, "ok");
494
495 if (!iface_tool_.lock()->SetWifiUpState(true)) {
496 LOG(ERROR) << "Failed to set WiFi interface up";
497 return WIFI_ERROR_UNKNOWN;
498 }
499 }
500
501 LOG(DEBUG) << "Starting legacy HAL";
502 status = global_func_table_.wifi_initialize(&global_handle_);
503 if (status != WIFI_SUCCESS || !global_handle_) {
504 LOG(ERROR) << "Failed to retrieve global handle";
505 return status;
506 }
507 std::thread(&WifiLegacyHal::runEventLoop, this).detach();
508 status = retrieveIfaceHandles();
509 if (status != WIFI_SUCCESS || iface_name_to_handle_.empty()) {
510 LOG(ERROR) << "Failed to retrieve wlan interface handle";
511 return status;
512 }
513 LOG(DEBUG) << "Legacy HAL start complete";
514 is_started_ = true;
515 return WIFI_SUCCESS;
516}
517
518wifi_error WifiLegacyHal::stop(
519 /* NONNULL */ std::unique_lock<std::recursive_mutex>* lock,
520 const std::function<void()>& on_stop_complete_user_callback) {
521 if (!is_started_) {
522 LOG(DEBUG) << "Legacy HAL already stopped";
523 on_stop_complete_user_callback();
524 return WIFI_SUCCESS;
525 }
526 LOG(DEBUG) << "Stopping legacy HAL";
527 on_stop_complete_internal_callback = [on_stop_complete_user_callback,
528 this](wifi_handle handle) {
529 CHECK_EQ(global_handle_, handle) << "Handle mismatch";
530 LOG(INFO) << "Legacy HAL stop complete callback received";
531 // Invalidate all the internal pointers now that the HAL is
532 // stopped.
533 invalidate();
534 if (is_primary_) iface_tool_.lock()->SetWifiUpState(false);
535 on_stop_complete_user_callback();
536 is_started_ = false;
537 };
538 awaiting_event_loop_termination_ = true;
539 global_func_table_.wifi_cleanup(global_handle_, onAsyncStopComplete);
540 const auto status =
541 stop_wait_cv_.wait_for(*lock, std::chrono::milliseconds(kMaxStopCompleteWaitMs),
542 [this] { return !awaiting_event_loop_termination_; });
543 if (!status) {
544 LOG(ERROR) << "Legacy HAL stop failed or timed out";
545 return WIFI_ERROR_UNKNOWN;
546 }
547 LOG(DEBUG) << "Legacy HAL stop complete";
548 return WIFI_SUCCESS;
549}
550
551bool WifiLegacyHal::isStarted() {
552 return is_started_;
553}
554
555wifi_error WifiLegacyHal::waitForDriverReady() {
556 return global_func_table_.wifi_wait_for_driver_ready();
557}
558
559std::pair<wifi_error, std::string> WifiLegacyHal::getDriverVersion(const std::string& iface_name) {
560 std::array<char, kMaxVersionStringLength> buffer;
561 buffer.fill(0);
562 wifi_error status = global_func_table_.wifi_get_driver_version(getIfaceHandle(iface_name),
563 buffer.data(), buffer.size());
564 return {status, buffer.data()};
565}
566
567std::pair<wifi_error, std::string> WifiLegacyHal::getFirmwareVersion(
568 const std::string& iface_name) {
569 std::array<char, kMaxVersionStringLength> buffer;
570 buffer.fill(0);
571 wifi_error status = global_func_table_.wifi_get_firmware_version(getIfaceHandle(iface_name),
572 buffer.data(), buffer.size());
573 return {status, buffer.data()};
574}
575
576std::pair<wifi_error, std::vector<uint8_t>> WifiLegacyHal::requestDriverMemoryDump(
577 const std::string& iface_name) {
578 std::vector<uint8_t> driver_dump;
579 on_driver_memory_dump_internal_callback = [&driver_dump](char* buffer, int buffer_size) {
580 driver_dump.insert(driver_dump.end(), reinterpret_cast<uint8_t*>(buffer),
581 reinterpret_cast<uint8_t*>(buffer) + buffer_size);
582 };
583 wifi_error status = global_func_table_.wifi_get_driver_memory_dump(getIfaceHandle(iface_name),
584 {onSyncDriverMemoryDump});
585 on_driver_memory_dump_internal_callback = nullptr;
586 return {status, std::move(driver_dump)};
587}
588
589std::pair<wifi_error, std::vector<uint8_t>> WifiLegacyHal::requestFirmwareMemoryDump(
590 const std::string& iface_name) {
591 std::vector<uint8_t> firmware_dump;
592 on_firmware_memory_dump_internal_callback = [&firmware_dump](char* buffer, int buffer_size) {
593 firmware_dump.insert(firmware_dump.end(), reinterpret_cast<uint8_t*>(buffer),
594 reinterpret_cast<uint8_t*>(buffer) + buffer_size);
595 };
596 wifi_error status = global_func_table_.wifi_get_firmware_memory_dump(
597 getIfaceHandle(iface_name), {onSyncFirmwareMemoryDump});
598 on_firmware_memory_dump_internal_callback = nullptr;
599 return {status, std::move(firmware_dump)};
600}
601
602std::pair<wifi_error, uint64_t> WifiLegacyHal::getSupportedFeatureSet(
603 const std::string& iface_name) {
604 feature_set set = 0, chip_set = 0;
605 wifi_error status = WIFI_SUCCESS;
606
607 static_assert(sizeof(set) == sizeof(uint64_t),
608 "Some feature_flags can not be represented in output");
609 wifi_interface_handle iface_handle = getIfaceHandle(iface_name);
610
611 global_func_table_.wifi_get_chip_feature_set(
612 global_handle_, &chip_set); /* ignore error, chip_set will stay 0 */
613
614 if (iface_handle) {
615 status = global_func_table_.wifi_get_supported_feature_set(iface_handle, &set);
616 }
617 return {status, static_cast<uint64_t>(set | chip_set)};
618}
619
620std::pair<wifi_error, PacketFilterCapabilities> WifiLegacyHal::getPacketFilterCapabilities(
621 const std::string& iface_name) {
622 PacketFilterCapabilities caps;
623 wifi_error status = global_func_table_.wifi_get_packet_filter_capabilities(
624 getIfaceHandle(iface_name), &caps.version, &caps.max_len);
625 return {status, caps};
626}
627
628wifi_error WifiLegacyHal::setPacketFilter(const std::string& iface_name,
629 const std::vector<uint8_t>& program) {
630 return global_func_table_.wifi_set_packet_filter(getIfaceHandle(iface_name), program.data(),
631 program.size());
632}
633
634std::pair<wifi_error, std::vector<uint8_t>> WifiLegacyHal::readApfPacketFilterData(
635 const std::string& iface_name) {
636 PacketFilterCapabilities caps;
637 wifi_error status = global_func_table_.wifi_get_packet_filter_capabilities(
638 getIfaceHandle(iface_name), &caps.version, &caps.max_len);
639 if (status != WIFI_SUCCESS) {
640 return {status, {}};
641 }
642
643 // Size the buffer to read the entire program & work memory.
644 std::vector<uint8_t> buffer(caps.max_len);
645
646 status = global_func_table_.wifi_read_packet_filter(
647 getIfaceHandle(iface_name), /*src_offset=*/0, buffer.data(), buffer.size());
648 return {status, std::move(buffer)};
649}
650
651std::pair<wifi_error, wifi_gscan_capabilities> WifiLegacyHal::getGscanCapabilities(
652 const std::string& iface_name) {
653 wifi_gscan_capabilities caps;
654 wifi_error status =
655 global_func_table_.wifi_get_gscan_capabilities(getIfaceHandle(iface_name), &caps);
656 return {status, caps};
657}
658
659wifi_error WifiLegacyHal::startGscan(
660 const std::string& iface_name, wifi_request_id id, const wifi_scan_cmd_params& params,
661 const std::function<void(wifi_request_id)>& on_failure_user_callback,
662 const on_gscan_results_callback& on_results_user_callback,
663 const on_gscan_full_result_callback& on_full_result_user_callback) {
664 // If there is already an ongoing background scan, reject new scan requests.
665 if (on_gscan_event_internal_callback || on_gscan_full_result_internal_callback) {
666 return WIFI_ERROR_NOT_AVAILABLE;
667 }
668
669 // This callback will be used to either trigger |on_results_user_callback|
670 // or |on_failure_user_callback|.
671 on_gscan_event_internal_callback = [iface_name, on_failure_user_callback,
672 on_results_user_callback,
673 this](wifi_request_id id, wifi_scan_event event) {
674 switch (event) {
675 case WIFI_SCAN_RESULTS_AVAILABLE:
676 case WIFI_SCAN_THRESHOLD_NUM_SCANS:
677 case WIFI_SCAN_THRESHOLD_PERCENT: {
678 wifi_error status;
679 std::vector<wifi_cached_scan_results> cached_scan_results;
680 std::tie(status, cached_scan_results) = getGscanCachedResults(iface_name);
681 if (status == WIFI_SUCCESS) {
682 on_results_user_callback(id, cached_scan_results);
683 return;
684 }
685 FALLTHROUGH_INTENDED;
686 }
687 // Fall through if failed. Failure to retrieve cached scan
688 // results should trigger a background scan failure.
689 case WIFI_SCAN_FAILED:
690 on_failure_user_callback(id);
691 on_gscan_event_internal_callback = nullptr;
692 on_gscan_full_result_internal_callback = nullptr;
693 return;
694 }
695 LOG(FATAL) << "Unexpected gscan event received: " << event;
696 };
697
698 on_gscan_full_result_internal_callback = [on_full_result_user_callback](
699 wifi_request_id id, wifi_scan_result* result,
700 uint32_t buckets_scanned) {
701 if (result) {
702 on_full_result_user_callback(id, result, buckets_scanned);
703 }
704 };
705
706 wifi_scan_result_handler handler = {onAsyncGscanFullResult, onAsyncGscanEvent};
707 wifi_error status =
708 global_func_table_.wifi_start_gscan(id, getIfaceHandle(iface_name), params, handler);
709 if (status != WIFI_SUCCESS) {
710 on_gscan_event_internal_callback = nullptr;
711 on_gscan_full_result_internal_callback = nullptr;
712 }
713 return status;
714}
715
716wifi_error WifiLegacyHal::stopGscan(const std::string& iface_name, wifi_request_id id) {
717 // If there is no an ongoing background scan, reject stop requests.
718 // TODO(b/32337212): This needs to be handled by the HIDL object because we
719 // need to return the NOT_STARTED error code.
720 if (!on_gscan_event_internal_callback && !on_gscan_full_result_internal_callback) {
721 return WIFI_ERROR_NOT_AVAILABLE;
722 }
723 wifi_error status = global_func_table_.wifi_stop_gscan(id, getIfaceHandle(iface_name));
724 // If the request Id is wrong, don't stop the ongoing background scan. Any
725 // other error should be treated as the end of background scan.
726 if (status != WIFI_ERROR_INVALID_REQUEST_ID) {
727 on_gscan_event_internal_callback = nullptr;
728 on_gscan_full_result_internal_callback = nullptr;
729 }
730 return status;
731}
732
733std::pair<wifi_error, std::vector<uint32_t>> WifiLegacyHal::getValidFrequenciesForBand(
734 const std::string& iface_name, wifi_band band) {
735 static_assert(sizeof(uint32_t) >= sizeof(wifi_channel),
736 "Wifi Channel cannot be represented in output");
737 std::vector<uint32_t> freqs;
738 freqs.resize(kMaxGscanFrequenciesForBand);
739 int32_t num_freqs = 0;
740 wifi_error status = global_func_table_.wifi_get_valid_channels(
741 getIfaceHandle(iface_name), band, freqs.size(),
742 reinterpret_cast<wifi_channel*>(freqs.data()), &num_freqs);
743 CHECK(num_freqs >= 0 && static_cast<uint32_t>(num_freqs) <= kMaxGscanFrequenciesForBand);
744 freqs.resize(num_freqs);
745 return {status, std::move(freqs)};
746}
747
748wifi_error WifiLegacyHal::setDfsFlag(const std::string& iface_name, bool dfs_on) {
749 return global_func_table_.wifi_set_nodfs_flag(getIfaceHandle(iface_name), dfs_on ? 0 : 1);
750}
751
752wifi_error WifiLegacyHal::enableLinkLayerStats(const std::string& iface_name, bool debug) {
753 wifi_link_layer_params params;
754 params.mpdu_size_threshold = kLinkLayerStatsDataMpduSizeThreshold;
755 params.aggressive_statistics_gathering = debug;
756 return global_func_table_.wifi_set_link_stats(getIfaceHandle(iface_name), params);
757}
758
759wifi_error WifiLegacyHal::disableLinkLayerStats(const std::string& iface_name) {
760 // TODO: Do we care about these responses?
761 uint32_t clear_mask_rsp;
762 uint8_t stop_rsp;
763 return global_func_table_.wifi_clear_link_stats(getIfaceHandle(iface_name), 0xFFFFFFFF,
764 &clear_mask_rsp, 1, &stop_rsp);
765}
766
Mahesh KKV5f30d332022-10-26 14:07:44 -0700767// Copies wifi_peer_info* to vector<WifiPeerInfo> and returns poiner to next element.
768wifi_peer_info* WifiLegacyHal::copyPeerInfo(wifi_peer_info* peer_ptr,
Ye Jiaodec38702023-02-10 11:37:58 +0800769 std::vector<WifiPeerInfo>& peers) {
Mahesh KKV5f30d332022-10-26 14:07:44 -0700770 WifiPeerInfo peer;
771 peer.peer_info = *peer_ptr;
772 if (peer_ptr->num_rate > 0) {
773 // Copy the rate stats.
774 peer.rate_stats.assign(peer_ptr->rate_stats, peer_ptr->rate_stats + peer_ptr->num_rate);
775 }
776 peer.peer_info.num_rate = 0;
777 // Push peer info.
778 peers.push_back(peer);
779 // Return the address of next peer info.
780 return (wifi_peer_info*)((u8*)peer_ptr + sizeof(wifi_peer_info) +
781 (sizeof(wifi_rate_stat) * peer_ptr->num_rate));
782}
783// Copies wifi_link_stat* to vector<LinkStats> and returns poiner to next element.
784wifi_link_stat* WifiLegacyHal::copyLinkStat(wifi_link_stat* stat_ptr,
Ye Jiaodec38702023-02-10 11:37:58 +0800785 std::vector<LinkStats>& stats) {
Mahesh KKV5f30d332022-10-26 14:07:44 -0700786 LinkStats linkStat;
787 linkStat.stat = *stat_ptr;
788 wifi_peer_info* l_peer_info_stats_ptr = stat_ptr->peer_info;
789 for (uint32_t i = 0; i < linkStat.stat.num_peers; i++) {
790 l_peer_info_stats_ptr = copyPeerInfo(l_peer_info_stats_ptr, linkStat.peers);
791 }
792 // Copied all peers to linkStat.peers.
793 linkStat.stat.num_peers = 0;
794 // Push link stat.
795 stats.push_back(linkStat);
796 // Read all peers, return the address of next wifi_link_stat.
797 return (wifi_link_stat*)l_peer_info_stats_ptr;
798}
799
800wifi_error WifiLegacyHal::getLinkLayerStats(const std::string& iface_name,
801 LinkLayerStats& link_stats,
802 LinkLayerMlStats& link_ml_stats) {
Gabriel Birenf3262f92022-07-15 23:25:39 +0000803 LinkLayerStats* link_stats_ptr = &link_stats;
Mahesh KKV5f30d332022-10-26 14:07:44 -0700804 link_stats_ptr->valid = false;
Gabriel Birenf3262f92022-07-15 23:25:39 +0000805
806 on_link_layer_stats_result_internal_callback = [&link_stats_ptr](
807 wifi_request_id /* id */,
808 wifi_iface_stat* iface_stats_ptr,
809 int num_radios,
810 wifi_radio_stat* radio_stats_ptr) {
811 wifi_radio_stat* l_radio_stats_ptr;
812 wifi_peer_info* l_peer_info_stats_ptr;
Mahesh KKV5f30d332022-10-26 14:07:44 -0700813 link_stats_ptr->valid = true;
Gabriel Birenf3262f92022-07-15 23:25:39 +0000814
815 if (iface_stats_ptr != nullptr) {
816 link_stats_ptr->iface = *iface_stats_ptr;
817 l_peer_info_stats_ptr = iface_stats_ptr->peer_info;
818 for (uint32_t i = 0; i < iface_stats_ptr->num_peers; i++) {
819 WifiPeerInfo peer;
820 peer.peer_info = *l_peer_info_stats_ptr;
821 if (l_peer_info_stats_ptr->num_rate > 0) {
822 /* Copy the rate stats */
823 peer.rate_stats.assign(
824 l_peer_info_stats_ptr->rate_stats,
825 l_peer_info_stats_ptr->rate_stats + l_peer_info_stats_ptr->num_rate);
826 }
827 peer.peer_info.num_rate = 0;
828 link_stats_ptr->peers.push_back(peer);
829 l_peer_info_stats_ptr =
830 (wifi_peer_info*)((u8*)l_peer_info_stats_ptr + sizeof(wifi_peer_info) +
831 (sizeof(wifi_rate_stat) *
832 l_peer_info_stats_ptr->num_rate));
833 }
834 link_stats_ptr->iface.num_peers = 0;
835 } else {
836 LOG(ERROR) << "Invalid iface stats in link layer stats";
837 }
838 if (num_radios <= 0 || radio_stats_ptr == nullptr) {
839 LOG(ERROR) << "Invalid radio stats in link layer stats";
840 return;
841 }
842 l_radio_stats_ptr = radio_stats_ptr;
843 for (int i = 0; i < num_radios; i++) {
844 LinkLayerRadioStats radio;
845
846 radio.stats = *l_radio_stats_ptr;
847 // Copy over the tx level array to the separate vector.
848 if (l_radio_stats_ptr->num_tx_levels > 0 &&
849 l_radio_stats_ptr->tx_time_per_levels != nullptr) {
850 radio.tx_time_per_levels.assign(
851 l_radio_stats_ptr->tx_time_per_levels,
852 l_radio_stats_ptr->tx_time_per_levels + l_radio_stats_ptr->num_tx_levels);
853 }
854 radio.stats.num_tx_levels = 0;
855 radio.stats.tx_time_per_levels = nullptr;
856 /* Copy over the channel stat to separate vector */
857 if (l_radio_stats_ptr->num_channels > 0) {
858 /* Copy the channel stats */
859 radio.channel_stats.assign(
860 l_radio_stats_ptr->channels,
861 l_radio_stats_ptr->channels + l_radio_stats_ptr->num_channels);
862 }
863 link_stats_ptr->radios.push_back(radio);
864 l_radio_stats_ptr =
865 (wifi_radio_stat*)((u8*)l_radio_stats_ptr + sizeof(wifi_radio_stat) +
866 (sizeof(wifi_channel_stat) *
867 l_radio_stats_ptr->num_channels));
868 }
869 };
870
Mahesh KKV5f30d332022-10-26 14:07:44 -0700871 LinkLayerMlStats* link_ml_stats_ptr = &link_ml_stats;
872 link_ml_stats_ptr->valid = false;
873
874 on_link_layer_ml_stats_result_internal_callback =
875 [this, &link_ml_stats_ptr](wifi_request_id /* id */,
876 wifi_iface_ml_stat* iface_ml_stats_ptr, int num_radios,
877 wifi_radio_stat* radio_stats_ptr) {
878 wifi_radio_stat* l_radio_stats_ptr;
879 wifi_link_stat* l_link_stat_ptr;
880 link_ml_stats_ptr->valid = true;
881
882 if (iface_ml_stats_ptr != nullptr && iface_ml_stats_ptr->num_links > 0) {
883 // Copy stats from wifi_iface_ml_stat to LinkLayerMlStats,
884 // - num_links * links[] to vector of links.
885 // - num_peers * peer_info[] to vector of links[i].peers.
886 link_ml_stats_ptr->iface = *iface_ml_stats_ptr;
887 l_link_stat_ptr = iface_ml_stats_ptr->links;
888 for (int l = 0; l < iface_ml_stats_ptr->num_links; ++l) {
889 l_link_stat_ptr = copyLinkStat(l_link_stat_ptr, link_ml_stats_ptr->links);
890 }
891 } else {
892 LOG(ERROR) << "Invalid iface stats in link layer stats";
893 }
894 if (num_radios <= 0 || radio_stats_ptr == nullptr) {
895 LOG(ERROR) << "Invalid radio stats in link layer stats";
896 return;
897 }
898 l_radio_stats_ptr = radio_stats_ptr;
899 for (int i = 0; i < num_radios; i++) {
900 LinkLayerRadioStats radio;
901
902 radio.stats = *l_radio_stats_ptr;
903 // Copy over the tx level array to the separate vector.
904 if (l_radio_stats_ptr->num_tx_levels > 0 &&
905 l_radio_stats_ptr->tx_time_per_levels != nullptr) {
906 radio.tx_time_per_levels.assign(l_radio_stats_ptr->tx_time_per_levels,
907 l_radio_stats_ptr->tx_time_per_levels +
908 l_radio_stats_ptr->num_tx_levels);
909 }
910 radio.stats.num_tx_levels = 0;
911 radio.stats.tx_time_per_levels = nullptr;
912 /* Copy over the channel stat to separate vector */
913 if (l_radio_stats_ptr->num_channels > 0) {
914 /* Copy the channel stats */
915 radio.channel_stats.assign(
916 l_radio_stats_ptr->channels,
917 l_radio_stats_ptr->channels + l_radio_stats_ptr->num_channels);
918 }
919 link_ml_stats_ptr->radios.push_back(radio);
920 l_radio_stats_ptr =
921 (wifi_radio_stat*)((u8*)l_radio_stats_ptr + sizeof(wifi_radio_stat) +
922 (sizeof(wifi_channel_stat) *
923 l_radio_stats_ptr->num_channels));
924 }
925 };
926
927 wifi_error status = global_func_table_.wifi_get_link_stats(
928 0, getIfaceHandle(iface_name),
929 {onSyncLinkLayerStatsResult, onSyncLinkLayerMlStatsResult});
Gabriel Birenf3262f92022-07-15 23:25:39 +0000930 on_link_layer_stats_result_internal_callback = nullptr;
Mahesh KKV5f30d332022-10-26 14:07:44 -0700931 on_link_layer_ml_stats_result_internal_callback = nullptr;
932
933 return status;
Gabriel Birenf3262f92022-07-15 23:25:39 +0000934}
935
936wifi_error WifiLegacyHal::startRssiMonitoring(
937 const std::string& iface_name, wifi_request_id id, int8_t max_rssi, int8_t min_rssi,
938 const on_rssi_threshold_breached_callback& on_threshold_breached_user_callback) {
939 if (on_rssi_threshold_breached_internal_callback) {
940 return WIFI_ERROR_NOT_AVAILABLE;
941 }
942 on_rssi_threshold_breached_internal_callback = [on_threshold_breached_user_callback](
943 wifi_request_id id, uint8_t* bssid_ptr,
944 int8_t rssi) {
945 if (!bssid_ptr) {
946 return;
947 }
948 std::array<uint8_t, ETH_ALEN> bssid_arr;
949 // |bssid_ptr| pointer is assumed to have 6 bytes for the mac
950 // address.
951 std::copy(bssid_ptr, bssid_ptr + 6, std::begin(bssid_arr));
952 on_threshold_breached_user_callback(id, bssid_arr, rssi);
953 };
954 wifi_error status = global_func_table_.wifi_start_rssi_monitoring(
955 id, getIfaceHandle(iface_name), max_rssi, min_rssi, {onAsyncRssiThresholdBreached});
956 if (status != WIFI_SUCCESS) {
957 on_rssi_threshold_breached_internal_callback = nullptr;
958 }
959 return status;
960}
961
962wifi_error WifiLegacyHal::stopRssiMonitoring(const std::string& iface_name, wifi_request_id id) {
963 if (!on_rssi_threshold_breached_internal_callback) {
964 return WIFI_ERROR_NOT_AVAILABLE;
965 }
966 wifi_error status =
967 global_func_table_.wifi_stop_rssi_monitoring(id, getIfaceHandle(iface_name));
968 // If the request Id is wrong, don't stop the ongoing rssi monitoring. Any
969 // other error should be treated as the end of background scan.
970 if (status != WIFI_ERROR_INVALID_REQUEST_ID) {
971 on_rssi_threshold_breached_internal_callback = nullptr;
972 }
973 return status;
974}
975
976std::pair<wifi_error, wifi_roaming_capabilities> WifiLegacyHal::getRoamingCapabilities(
977 const std::string& iface_name) {
978 wifi_roaming_capabilities caps;
979 wifi_error status =
980 global_func_table_.wifi_get_roaming_capabilities(getIfaceHandle(iface_name), &caps);
981 return {status, caps};
982}
983
984wifi_error WifiLegacyHal::configureRoaming(const std::string& iface_name,
985 const wifi_roaming_config& config) {
986 wifi_roaming_config config_internal = config;
987 return global_func_table_.wifi_configure_roaming(getIfaceHandle(iface_name), &config_internal);
988}
989
990wifi_error WifiLegacyHal::enableFirmwareRoaming(const std::string& iface_name,
991 fw_roaming_state_t state) {
992 return global_func_table_.wifi_enable_firmware_roaming(getIfaceHandle(iface_name), state);
993}
994
995wifi_error WifiLegacyHal::configureNdOffload(const std::string& iface_name, bool enable) {
996 return global_func_table_.wifi_configure_nd_offload(getIfaceHandle(iface_name), enable);
997}
998
999wifi_error WifiLegacyHal::startSendingOffloadedPacket(const std::string& iface_name, int32_t cmd_id,
1000 uint16_t ether_type,
1001 const std::vector<uint8_t>& ip_packet_data,
1002 const std::array<uint8_t, 6>& src_address,
1003 const std::array<uint8_t, 6>& dst_address,
1004 int32_t period_in_ms) {
1005 std::vector<uint8_t> ip_packet_data_internal(ip_packet_data);
1006 std::vector<uint8_t> src_address_internal(src_address.data(),
1007 src_address.data() + src_address.size());
1008 std::vector<uint8_t> dst_address_internal(dst_address.data(),
1009 dst_address.data() + dst_address.size());
1010 return global_func_table_.wifi_start_sending_offloaded_packet(
1011 cmd_id, getIfaceHandle(iface_name), ether_type, ip_packet_data_internal.data(),
1012 ip_packet_data_internal.size(), src_address_internal.data(),
1013 dst_address_internal.data(), period_in_ms);
1014}
1015
1016wifi_error WifiLegacyHal::stopSendingOffloadedPacket(const std::string& iface_name,
1017 uint32_t cmd_id) {
1018 return global_func_table_.wifi_stop_sending_offloaded_packet(cmd_id,
1019 getIfaceHandle(iface_name));
1020}
1021
1022wifi_error WifiLegacyHal::selectTxPowerScenario(const std::string& iface_name,
1023 wifi_power_scenario scenario) {
1024 return global_func_table_.wifi_select_tx_power_scenario(getIfaceHandle(iface_name), scenario);
1025}
1026
1027wifi_error WifiLegacyHal::resetTxPowerScenario(const std::string& iface_name) {
1028 return global_func_table_.wifi_reset_tx_power_scenario(getIfaceHandle(iface_name));
1029}
1030
1031wifi_error WifiLegacyHal::setLatencyMode(const std::string& iface_name, wifi_latency_mode mode) {
1032 return global_func_table_.wifi_set_latency_mode(getIfaceHandle(iface_name), mode);
1033}
1034
1035wifi_error WifiLegacyHal::setThermalMitigationMode(wifi_thermal_mode mode,
1036 uint32_t completion_window) {
1037 return global_func_table_.wifi_set_thermal_mitigation_mode(global_handle_, mode,
1038 completion_window);
1039}
1040
1041wifi_error WifiLegacyHal::setDscpToAccessCategoryMapping(uint32_t start, uint32_t end,
1042 uint32_t access_category) {
1043 return global_func_table_.wifi_map_dscp_access_category(global_handle_, start, end,
1044 access_category);
1045}
1046
1047wifi_error WifiLegacyHal::resetDscpToAccessCategoryMapping() {
1048 return global_func_table_.wifi_reset_dscp_mapping(global_handle_);
1049}
1050
1051std::pair<wifi_error, uint32_t> WifiLegacyHal::getLoggerSupportedFeatureSet(
1052 const std::string& iface_name) {
1053 uint32_t supported_feature_flags = 0;
1054 wifi_error status = WIFI_SUCCESS;
1055
1056 wifi_interface_handle iface_handle = getIfaceHandle(iface_name);
1057
1058 if (iface_handle) {
1059 status = global_func_table_.wifi_get_logger_supported_feature_set(iface_handle,
1060 &supported_feature_flags);
1061 }
1062 return {status, supported_feature_flags};
1063}
1064
1065wifi_error WifiLegacyHal::startPktFateMonitoring(const std::string& iface_name) {
1066 return global_func_table_.wifi_start_pkt_fate_monitoring(getIfaceHandle(iface_name));
1067}
1068
1069std::pair<wifi_error, std::vector<wifi_tx_report>> WifiLegacyHal::getTxPktFates(
1070 const std::string& iface_name) {
1071 std::vector<wifi_tx_report> tx_pkt_fates;
1072 tx_pkt_fates.resize(MAX_FATE_LOG_LEN);
1073 size_t num_fates = 0;
1074 wifi_error status = global_func_table_.wifi_get_tx_pkt_fates(
1075 getIfaceHandle(iface_name), tx_pkt_fates.data(), tx_pkt_fates.size(), &num_fates);
1076 CHECK(num_fates <= MAX_FATE_LOG_LEN);
1077 tx_pkt_fates.resize(num_fates);
1078 return {status, std::move(tx_pkt_fates)};
1079}
1080
1081std::pair<wifi_error, std::vector<wifi_rx_report>> WifiLegacyHal::getRxPktFates(
1082 const std::string& iface_name) {
1083 std::vector<wifi_rx_report> rx_pkt_fates;
1084 rx_pkt_fates.resize(MAX_FATE_LOG_LEN);
1085 size_t num_fates = 0;
1086 wifi_error status = global_func_table_.wifi_get_rx_pkt_fates(
1087 getIfaceHandle(iface_name), rx_pkt_fates.data(), rx_pkt_fates.size(), &num_fates);
1088 CHECK(num_fates <= MAX_FATE_LOG_LEN);
1089 rx_pkt_fates.resize(num_fates);
1090 return {status, std::move(rx_pkt_fates)};
1091}
1092
1093std::pair<wifi_error, WakeReasonStats> WifiLegacyHal::getWakeReasonStats(
1094 const std::string& iface_name) {
1095 WakeReasonStats stats;
1096 stats.cmd_event_wake_cnt.resize(kMaxWakeReasonStatsArraySize);
1097 stats.driver_fw_local_wake_cnt.resize(kMaxWakeReasonStatsArraySize);
1098
1099 // This legacy struct needs separate memory to store the variable sized wake
1100 // reason types.
1101 stats.wake_reason_cnt.cmd_event_wake_cnt =
1102 reinterpret_cast<int32_t*>(stats.cmd_event_wake_cnt.data());
1103 stats.wake_reason_cnt.cmd_event_wake_cnt_sz = stats.cmd_event_wake_cnt.size();
1104 stats.wake_reason_cnt.cmd_event_wake_cnt_used = 0;
1105 stats.wake_reason_cnt.driver_fw_local_wake_cnt =
1106 reinterpret_cast<int32_t*>(stats.driver_fw_local_wake_cnt.data());
1107 stats.wake_reason_cnt.driver_fw_local_wake_cnt_sz = stats.driver_fw_local_wake_cnt.size();
1108 stats.wake_reason_cnt.driver_fw_local_wake_cnt_used = 0;
1109
1110 wifi_error status = global_func_table_.wifi_get_wake_reason_stats(getIfaceHandle(iface_name),
1111 &stats.wake_reason_cnt);
1112
1113 CHECK(stats.wake_reason_cnt.cmd_event_wake_cnt_used >= 0 &&
1114 static_cast<uint32_t>(stats.wake_reason_cnt.cmd_event_wake_cnt_used) <=
1115 kMaxWakeReasonStatsArraySize);
1116 stats.cmd_event_wake_cnt.resize(stats.wake_reason_cnt.cmd_event_wake_cnt_used);
1117 stats.wake_reason_cnt.cmd_event_wake_cnt = nullptr;
1118
1119 CHECK(stats.wake_reason_cnt.driver_fw_local_wake_cnt_used >= 0 &&
1120 static_cast<uint32_t>(stats.wake_reason_cnt.driver_fw_local_wake_cnt_used) <=
1121 kMaxWakeReasonStatsArraySize);
1122 stats.driver_fw_local_wake_cnt.resize(stats.wake_reason_cnt.driver_fw_local_wake_cnt_used);
1123 stats.wake_reason_cnt.driver_fw_local_wake_cnt = nullptr;
1124
1125 return {status, stats};
1126}
1127
1128wifi_error WifiLegacyHal::registerRingBufferCallbackHandler(
1129 const std::string& iface_name, const on_ring_buffer_data_callback& on_user_data_callback) {
1130 if (on_ring_buffer_data_internal_callback) {
1131 return WIFI_ERROR_NOT_AVAILABLE;
1132 }
1133 on_ring_buffer_data_internal_callback = [on_user_data_callback](
1134 char* ring_name, char* buffer, int buffer_size,
1135 wifi_ring_buffer_status* status) {
1136 if (status && buffer) {
1137 std::vector<uint8_t> buffer_vector(reinterpret_cast<uint8_t*>(buffer),
1138 reinterpret_cast<uint8_t*>(buffer) + buffer_size);
1139 on_user_data_callback(ring_name, buffer_vector, *status);
1140 }
1141 };
1142 wifi_error status = global_func_table_.wifi_set_log_handler(0, getIfaceHandle(iface_name),
1143 {onAsyncRingBufferData});
1144 if (status != WIFI_SUCCESS) {
1145 on_ring_buffer_data_internal_callback = nullptr;
1146 }
1147 return status;
1148}
1149
1150wifi_error WifiLegacyHal::deregisterRingBufferCallbackHandler(const std::string& iface_name) {
1151 if (!on_ring_buffer_data_internal_callback) {
1152 return WIFI_ERROR_NOT_AVAILABLE;
1153 }
1154 on_ring_buffer_data_internal_callback = nullptr;
1155 return global_func_table_.wifi_reset_log_handler(0, getIfaceHandle(iface_name));
1156}
1157
1158std::pair<wifi_error, std::vector<wifi_ring_buffer_status>> WifiLegacyHal::getRingBuffersStatus(
1159 const std::string& iface_name) {
1160 std::vector<wifi_ring_buffer_status> ring_buffers_status;
1161 ring_buffers_status.resize(kMaxRingBuffers);
1162 uint32_t num_rings = kMaxRingBuffers;
1163 wifi_error status = global_func_table_.wifi_get_ring_buffers_status(
1164 getIfaceHandle(iface_name), &num_rings, ring_buffers_status.data());
1165 CHECK(num_rings <= kMaxRingBuffers);
1166 ring_buffers_status.resize(num_rings);
1167 return {status, std::move(ring_buffers_status)};
1168}
1169
1170wifi_error WifiLegacyHal::startRingBufferLogging(const std::string& iface_name,
1171 const std::string& ring_name,
1172 uint32_t verbose_level, uint32_t max_interval_sec,
1173 uint32_t min_data_size) {
1174 return global_func_table_.wifi_start_logging(getIfaceHandle(iface_name), verbose_level, 0,
1175 max_interval_sec, min_data_size,
1176 makeCharVec(ring_name).data());
1177}
1178
1179wifi_error WifiLegacyHal::getRingBufferData(const std::string& iface_name,
1180 const std::string& ring_name) {
1181 return global_func_table_.wifi_get_ring_data(getIfaceHandle(iface_name),
1182 makeCharVec(ring_name).data());
1183}
1184
1185wifi_error WifiLegacyHal::registerErrorAlertCallbackHandler(
1186 const std::string& iface_name, const on_error_alert_callback& on_user_alert_callback) {
1187 if (on_error_alert_internal_callback) {
1188 return WIFI_ERROR_NOT_AVAILABLE;
1189 }
1190 on_error_alert_internal_callback = [on_user_alert_callback](wifi_request_id id, char* buffer,
1191 int buffer_size, int err_code) {
1192 if (buffer) {
1193 CHECK(id == 0);
1194 on_user_alert_callback(
1195 err_code,
1196 std::vector<uint8_t>(reinterpret_cast<uint8_t*>(buffer),
1197 reinterpret_cast<uint8_t*>(buffer) + buffer_size));
1198 }
1199 };
1200 wifi_error status = global_func_table_.wifi_set_alert_handler(0, getIfaceHandle(iface_name),
1201 {onAsyncErrorAlert});
1202 if (status != WIFI_SUCCESS) {
1203 on_error_alert_internal_callback = nullptr;
1204 }
1205 return status;
1206}
1207
1208wifi_error WifiLegacyHal::deregisterErrorAlertCallbackHandler(const std::string& iface_name) {
1209 if (!on_error_alert_internal_callback) {
1210 return WIFI_ERROR_NOT_AVAILABLE;
1211 }
1212 on_error_alert_internal_callback = nullptr;
1213 return global_func_table_.wifi_reset_alert_handler(0, getIfaceHandle(iface_name));
1214}
1215
1216wifi_error WifiLegacyHal::registerRadioModeChangeCallbackHandler(
1217 const std::string& iface_name,
1218 const on_radio_mode_change_callback& on_user_change_callback) {
1219 if (on_radio_mode_change_internal_callback) {
1220 return WIFI_ERROR_NOT_AVAILABLE;
1221 }
1222 on_radio_mode_change_internal_callback = [on_user_change_callback](
1223 wifi_request_id /* id */, uint32_t num_macs,
1224 wifi_mac_info* mac_infos_arr) {
1225 if (num_macs > 0 && mac_infos_arr) {
1226 std::vector<WifiMacInfo> mac_infos_vec;
1227 for (uint32_t i = 0; i < num_macs; i++) {
1228 WifiMacInfo mac_info;
1229 mac_info.wlan_mac_id = mac_infos_arr[i].wlan_mac_id;
1230 mac_info.mac_band = mac_infos_arr[i].mac_band;
1231 for (int32_t j = 0; j < mac_infos_arr[i].num_iface; j++) {
1232 WifiIfaceInfo iface_info;
1233 iface_info.name = mac_infos_arr[i].iface_info[j].iface_name;
1234 iface_info.channel = mac_infos_arr[i].iface_info[j].channel;
1235 mac_info.iface_infos.push_back(iface_info);
1236 }
1237 mac_infos_vec.push_back(mac_info);
1238 }
1239 on_user_change_callback(mac_infos_vec);
1240 }
1241 };
1242 wifi_error status = global_func_table_.wifi_set_radio_mode_change_handler(
1243 0, getIfaceHandle(iface_name), {onAsyncRadioModeChange});
1244 if (status != WIFI_SUCCESS) {
1245 on_radio_mode_change_internal_callback = nullptr;
1246 }
1247 return status;
1248}
1249
1250wifi_error WifiLegacyHal::registerSubsystemRestartCallbackHandler(
1251 const on_subsystem_restart_callback& on_restart_callback) {
1252 if (on_subsystem_restart_internal_callback) {
1253 return WIFI_ERROR_NOT_AVAILABLE;
1254 }
1255 on_subsystem_restart_internal_callback = [on_restart_callback](const char* error) {
1256 on_restart_callback(error);
1257 };
1258 wifi_error status = global_func_table_.wifi_set_subsystem_restart_handler(
1259 global_handle_, {onAsyncSubsystemRestart});
1260 if (status != WIFI_SUCCESS) {
1261 on_subsystem_restart_internal_callback = nullptr;
1262 }
1263 return status;
1264}
1265
maheshkkv7d422812023-11-16 17:32:50 -08001266wifi_error WifiLegacyHal::startRttRangeRequestV3(
1267 const std::string& iface_name, wifi_request_id id,
1268 const std::vector<wifi_rtt_config_v3>& rtt_configs,
1269 const on_rtt_results_callback_v3& on_results_user_callback_v3) {
1270 if (on_rtt_results_internal_callback_v3) {
1271 return WIFI_ERROR_NOT_AVAILABLE;
1272 }
1273
1274 on_rtt_results_internal_callback_v3 = [on_results_user_callback_v3](
1275 wifi_request_id id, unsigned num_results,
1276 wifi_rtt_result_v3* rtt_results_v3[]) {
1277 if (num_results > 0 && !rtt_results_v3) {
1278 LOG(ERROR) << "Unexpected nullptr in RTT v3 results";
1279 return;
1280 }
1281 std::vector<const wifi_rtt_result_v3*> rtt_results_vec_v3;
1282 std::copy_if(rtt_results_v3, rtt_results_v3 + num_results,
1283 back_inserter(rtt_results_vec_v3),
1284 [](wifi_rtt_result_v3* rtt_result_v3) { return rtt_result_v3 != nullptr; });
1285 on_results_user_callback_v3(id, rtt_results_vec_v3);
1286 };
1287
1288 std::vector<wifi_rtt_config_v3> rtt_configs_internal(rtt_configs);
1289 wifi_error status = global_func_table_.wifi_rtt_range_request_v3(
1290 id, getIfaceHandle(iface_name), rtt_configs.size(), rtt_configs_internal.data(),
1291 {onAsyncRttResultsV3});
1292 if (status != WIFI_SUCCESS) {
1293 invalidateRttResultsCallbacks();
1294 }
1295 return status;
1296}
1297
Gabriel Birenf3262f92022-07-15 23:25:39 +00001298wifi_error WifiLegacyHal::startRttRangeRequest(
1299 const std::string& iface_name, wifi_request_id id,
1300 const std::vector<wifi_rtt_config>& rtt_configs,
Sunil Ravif8fc2372022-11-10 18:37:41 +00001301 const on_rtt_results_callback& on_results_user_callback,
1302 const on_rtt_results_callback_v2& on_results_user_callback_v2) {
1303 if (on_rtt_results_internal_callback || on_rtt_results_internal_callback_v2) {
Gabriel Birenf3262f92022-07-15 23:25:39 +00001304 return WIFI_ERROR_NOT_AVAILABLE;
1305 }
1306
1307 on_rtt_results_internal_callback = [on_results_user_callback](wifi_request_id id,
1308 unsigned num_results,
1309 wifi_rtt_result* rtt_results[]) {
1310 if (num_results > 0 && !rtt_results) {
1311 LOG(ERROR) << "Unexpected nullptr in RTT results";
1312 return;
1313 }
1314 std::vector<const wifi_rtt_result*> rtt_results_vec;
1315 std::copy_if(rtt_results, rtt_results + num_results, back_inserter(rtt_results_vec),
1316 [](wifi_rtt_result* rtt_result) { return rtt_result != nullptr; });
1317 on_results_user_callback(id, rtt_results_vec);
1318 };
1319
Sunil Ravif8fc2372022-11-10 18:37:41 +00001320 on_rtt_results_internal_callback_v2 = [on_results_user_callback_v2](
1321 wifi_request_id id, unsigned num_results,
1322 wifi_rtt_result_v2* rtt_results_v2[]) {
1323 if (num_results > 0 && !rtt_results_v2) {
1324 LOG(ERROR) << "Unexpected nullptr in RTT results";
1325 return;
1326 }
1327 std::vector<const wifi_rtt_result_v2*> rtt_results_vec_v2;
1328 std::copy_if(rtt_results_v2, rtt_results_v2 + num_results,
1329 back_inserter(rtt_results_vec_v2),
1330 [](wifi_rtt_result_v2* rtt_result_v2) { return rtt_result_v2 != nullptr; });
1331 on_results_user_callback_v2(id, rtt_results_vec_v2);
1332 };
1333
Gabriel Birenf3262f92022-07-15 23:25:39 +00001334 std::vector<wifi_rtt_config> rtt_configs_internal(rtt_configs);
1335 wifi_error status = global_func_table_.wifi_rtt_range_request(
1336 id, getIfaceHandle(iface_name), rtt_configs.size(), rtt_configs_internal.data(),
Sunil Ravif8fc2372022-11-10 18:37:41 +00001337 {onAsyncRttResults, onAsyncRttResultsV2});
Gabriel Birenf3262f92022-07-15 23:25:39 +00001338 if (status != WIFI_SUCCESS) {
Sunil Ravif8fc2372022-11-10 18:37:41 +00001339 invalidateRttResultsCallbacks();
Gabriel Birenf3262f92022-07-15 23:25:39 +00001340 }
1341 return status;
1342}
1343
1344wifi_error WifiLegacyHal::cancelRttRangeRequest(
1345 const std::string& iface_name, wifi_request_id id,
1346 const std::vector<std::array<uint8_t, ETH_ALEN>>& mac_addrs) {
Sunil Ravif8fc2372022-11-10 18:37:41 +00001347 if (!on_rtt_results_internal_callback && !on_rtt_results_internal_callback_v2) {
Gabriel Birenf3262f92022-07-15 23:25:39 +00001348 return WIFI_ERROR_NOT_AVAILABLE;
1349 }
1350 static_assert(sizeof(mac_addr) == sizeof(std::array<uint8_t, ETH_ALEN>),
1351 "MAC address size mismatch");
1352 // TODO: How do we handle partial cancels (i.e only a subset of enabled mac
1353 // addressed are cancelled).
1354 std::vector<std::array<uint8_t, ETH_ALEN>> mac_addrs_internal(mac_addrs);
1355 wifi_error status = global_func_table_.wifi_rtt_range_cancel(
1356 id, getIfaceHandle(iface_name), mac_addrs.size(),
1357 reinterpret_cast<mac_addr*>(mac_addrs_internal.data()));
1358 // If the request Id is wrong, don't stop the ongoing range request. Any
1359 // other error should be treated as the end of rtt ranging.
1360 if (status != WIFI_ERROR_INVALID_REQUEST_ID) {
Sunil Ravif8fc2372022-11-10 18:37:41 +00001361 invalidateRttResultsCallbacks();
Gabriel Birenf3262f92022-07-15 23:25:39 +00001362 }
1363 return status;
1364}
1365
1366std::pair<wifi_error, wifi_rtt_capabilities> WifiLegacyHal::getRttCapabilities(
1367 const std::string& iface_name) {
1368 wifi_rtt_capabilities rtt_caps;
1369 wifi_error status =
1370 global_func_table_.wifi_get_rtt_capabilities(getIfaceHandle(iface_name), &rtt_caps);
1371 return {status, rtt_caps};
1372}
1373
maheshkkv7d422812023-11-16 17:32:50 -08001374std::pair<wifi_error, wifi_rtt_capabilities_v3> WifiLegacyHal::getRttCapabilitiesV3(
1375 const std::string& iface_name) {
1376 wifi_rtt_capabilities_v3 rtt_caps_v3;
1377 wifi_error status = global_func_table_.wifi_get_rtt_capabilities_v3(getIfaceHandle(iface_name),
1378 &rtt_caps_v3);
1379 return {status, rtt_caps_v3};
1380}
1381
Gabriel Birenf3262f92022-07-15 23:25:39 +00001382std::pair<wifi_error, wifi_rtt_responder> WifiLegacyHal::getRttResponderInfo(
1383 const std::string& iface_name) {
1384 wifi_rtt_responder rtt_responder;
1385 wifi_error status = global_func_table_.wifi_rtt_get_responder_info(getIfaceHandle(iface_name),
1386 &rtt_responder);
1387 return {status, rtt_responder};
1388}
1389
1390wifi_error WifiLegacyHal::enableRttResponder(const std::string& iface_name, wifi_request_id id,
1391 const wifi_channel_info& channel_hint,
1392 uint32_t max_duration_secs,
1393 const wifi_rtt_responder& info) {
1394 wifi_rtt_responder info_internal(info);
1395 return global_func_table_.wifi_enable_responder(id, getIfaceHandle(iface_name), channel_hint,
1396 max_duration_secs, &info_internal);
1397}
1398
1399wifi_error WifiLegacyHal::disableRttResponder(const std::string& iface_name, wifi_request_id id) {
1400 return global_func_table_.wifi_disable_responder(id, getIfaceHandle(iface_name));
1401}
1402
1403wifi_error WifiLegacyHal::setRttLci(const std::string& iface_name, wifi_request_id id,
1404 const wifi_lci_information& info) {
1405 wifi_lci_information info_internal(info);
1406 return global_func_table_.wifi_set_lci(id, getIfaceHandle(iface_name), &info_internal);
1407}
1408
1409wifi_error WifiLegacyHal::setRttLcr(const std::string& iface_name, wifi_request_id id,
1410 const wifi_lcr_information& info) {
1411 wifi_lcr_information info_internal(info);
1412 return global_func_table_.wifi_set_lcr(id, getIfaceHandle(iface_name), &info_internal);
1413}
1414
1415wifi_error WifiLegacyHal::nanRegisterCallbackHandlers(const std::string& iface_name,
1416 const NanCallbackHandlers& user_callbacks) {
1417 on_nan_notify_response_user_callback = user_callbacks.on_notify_response;
1418 on_nan_event_publish_terminated_user_callback = user_callbacks.on_event_publish_terminated;
1419 on_nan_event_match_user_callback = user_callbacks.on_event_match;
1420 on_nan_event_match_expired_user_callback = user_callbacks.on_event_match_expired;
1421 on_nan_event_subscribe_terminated_user_callback = user_callbacks.on_event_subscribe_terminated;
1422 on_nan_event_followup_user_callback = user_callbacks.on_event_followup;
1423 on_nan_event_disc_eng_event_user_callback = user_callbacks.on_event_disc_eng_event;
1424 on_nan_event_disabled_user_callback = user_callbacks.on_event_disabled;
1425 on_nan_event_tca_user_callback = user_callbacks.on_event_tca;
1426 on_nan_event_beacon_sdf_payload_user_callback = user_callbacks.on_event_beacon_sdf_payload;
1427 on_nan_event_data_path_request_user_callback = user_callbacks.on_event_data_path_request;
Nate Jiang38e8db52022-12-02 17:30:27 -08001428 on_nan_event_pairing_request_user_callback = user_callbacks.on_event_pairing_request;
1429 on_nan_event_pairing_confirm_user_callback = user_callbacks.on_event_pairing_confirm;
1430 on_nan_event_bootstrapping_request_user_callback =
1431 user_callbacks.on_event_bootstrapping_request;
1432 on_nan_event_bootstrapping_confirm_user_callback =
1433 user_callbacks.on_event_bootstrapping_confirm;
Gabriel Birenf3262f92022-07-15 23:25:39 +00001434 on_nan_event_data_path_confirm_user_callback = user_callbacks.on_event_data_path_confirm;
1435 on_nan_event_data_path_end_user_callback = user_callbacks.on_event_data_path_end;
1436 on_nan_event_transmit_follow_up_user_callback = user_callbacks.on_event_transmit_follow_up;
1437 on_nan_event_range_request_user_callback = user_callbacks.on_event_range_request;
1438 on_nan_event_range_report_user_callback = user_callbacks.on_event_range_report;
1439 on_nan_event_schedule_update_user_callback = user_callbacks.on_event_schedule_update;
Nate Jiangd6cc3312023-02-14 16:37:54 -08001440 on_nan_event_suspension_mode_change_user_callback =
1441 user_callbacks.on_event_suspension_mode_change;
Gabriel Birenf3262f92022-07-15 23:25:39 +00001442
Nate Jiang38e8db52022-12-02 17:30:27 -08001443 return global_func_table_.wifi_nan_register_handler(getIfaceHandle(iface_name),
1444 {onAsyncNanNotifyResponse,
1445 onAsyncNanEventPublishReplied,
1446 onAsyncNanEventPublishTerminated,
1447 onAsyncNanEventMatch,
1448 onAsyncNanEventMatchExpired,
1449 onAsyncNanEventSubscribeTerminated,
1450 onAsyncNanEventFollowup,
1451 onAsyncNanEventDiscEngEvent,
1452 onAsyncNanEventDisabled,
1453 onAsyncNanEventTca,
1454 onAsyncNanEventBeaconSdfPayload,
1455 onAsyncNanEventDataPathRequest,
1456 onAsyncNanEventDataPathConfirm,
1457 onAsyncNanEventDataPathEnd,
1458 onAsyncNanEventTransmitFollowUp,
1459 onAsyncNanEventRangeRequest,
1460 onAsyncNanEventRangeReport,
1461 onAsyncNanEventScheduleUpdate,
1462 onAsyncNanEventPairingRequest,
1463 onAsyncNanEventPairingConfirm,
1464 onAsyncNanEventBootstrappingRequest,
Nate Jiangd6cc3312023-02-14 16:37:54 -08001465 onAsyncNanEventBootstrappingConfirm,
1466 onAsyncNanEventSuspensionModeChange});
Gabriel Birenf3262f92022-07-15 23:25:39 +00001467}
1468
1469wifi_error WifiLegacyHal::nanEnableRequest(const std::string& iface_name, transaction_id id,
1470 const NanEnableRequest& msg) {
1471 NanEnableRequest msg_internal(msg);
1472 return global_func_table_.wifi_nan_enable_request(id, getIfaceHandle(iface_name),
1473 &msg_internal);
1474}
1475
1476wifi_error WifiLegacyHal::nanDisableRequest(const std::string& iface_name, transaction_id id) {
1477 return global_func_table_.wifi_nan_disable_request(id, getIfaceHandle(iface_name));
1478}
1479
1480wifi_error WifiLegacyHal::nanPublishRequest(const std::string& iface_name, transaction_id id,
1481 const NanPublishRequest& msg) {
1482 NanPublishRequest msg_internal(msg);
1483 return global_func_table_.wifi_nan_publish_request(id, getIfaceHandle(iface_name),
1484 &msg_internal);
1485}
1486
1487wifi_error WifiLegacyHal::nanPublishCancelRequest(const std::string& iface_name, transaction_id id,
1488 const NanPublishCancelRequest& msg) {
1489 NanPublishCancelRequest msg_internal(msg);
1490 return global_func_table_.wifi_nan_publish_cancel_request(id, getIfaceHandle(iface_name),
1491 &msg_internal);
1492}
1493
1494wifi_error WifiLegacyHal::nanSubscribeRequest(const std::string& iface_name, transaction_id id,
1495 const NanSubscribeRequest& msg) {
1496 NanSubscribeRequest msg_internal(msg);
1497 return global_func_table_.wifi_nan_subscribe_request(id, getIfaceHandle(iface_name),
1498 &msg_internal);
1499}
1500
1501wifi_error WifiLegacyHal::nanSubscribeCancelRequest(const std::string& iface_name,
1502 transaction_id id,
1503 const NanSubscribeCancelRequest& msg) {
1504 NanSubscribeCancelRequest msg_internal(msg);
1505 return global_func_table_.wifi_nan_subscribe_cancel_request(id, getIfaceHandle(iface_name),
1506 &msg_internal);
1507}
1508
1509wifi_error WifiLegacyHal::nanTransmitFollowupRequest(const std::string& iface_name,
1510 transaction_id id,
1511 const NanTransmitFollowupRequest& msg) {
1512 NanTransmitFollowupRequest msg_internal(msg);
1513 return global_func_table_.wifi_nan_transmit_followup_request(id, getIfaceHandle(iface_name),
1514 &msg_internal);
1515}
1516
1517wifi_error WifiLegacyHal::nanStatsRequest(const std::string& iface_name, transaction_id id,
1518 const NanStatsRequest& msg) {
1519 NanStatsRequest msg_internal(msg);
1520 return global_func_table_.wifi_nan_stats_request(id, getIfaceHandle(iface_name), &msg_internal);
1521}
1522
1523wifi_error WifiLegacyHal::nanConfigRequest(const std::string& iface_name, transaction_id id,
1524 const NanConfigRequest& msg) {
1525 NanConfigRequest msg_internal(msg);
1526 return global_func_table_.wifi_nan_config_request(id, getIfaceHandle(iface_name),
1527 &msg_internal);
1528}
1529
1530wifi_error WifiLegacyHal::nanTcaRequest(const std::string& iface_name, transaction_id id,
1531 const NanTCARequest& msg) {
1532 NanTCARequest msg_internal(msg);
1533 return global_func_table_.wifi_nan_tca_request(id, getIfaceHandle(iface_name), &msg_internal);
1534}
1535
1536wifi_error WifiLegacyHal::nanBeaconSdfPayloadRequest(const std::string& iface_name,
1537 transaction_id id,
1538 const NanBeaconSdfPayloadRequest& msg) {
1539 NanBeaconSdfPayloadRequest msg_internal(msg);
1540 return global_func_table_.wifi_nan_beacon_sdf_payload_request(id, getIfaceHandle(iface_name),
1541 &msg_internal);
1542}
1543
1544std::pair<wifi_error, NanVersion> WifiLegacyHal::nanGetVersion() {
1545 NanVersion version;
1546 wifi_error status = global_func_table_.wifi_nan_get_version(global_handle_, &version);
1547 return {status, version};
1548}
1549
1550wifi_error WifiLegacyHal::nanGetCapabilities(const std::string& iface_name, transaction_id id) {
1551 return global_func_table_.wifi_nan_get_capabilities(id, getIfaceHandle(iface_name));
1552}
1553
1554wifi_error WifiLegacyHal::nanDataInterfaceCreate(const std::string& iface_name, transaction_id id,
1555 const std::string& data_iface_name) {
1556 return global_func_table_.wifi_nan_data_interface_create(id, getIfaceHandle(iface_name),
1557 makeCharVec(data_iface_name).data());
1558}
1559
1560wifi_error WifiLegacyHal::nanDataInterfaceDelete(const std::string& iface_name, transaction_id id,
1561 const std::string& data_iface_name) {
1562 return global_func_table_.wifi_nan_data_interface_delete(id, getIfaceHandle(iface_name),
1563 makeCharVec(data_iface_name).data());
1564}
1565
1566wifi_error WifiLegacyHal::nanDataRequestInitiator(const std::string& iface_name, transaction_id id,
1567 const NanDataPathInitiatorRequest& msg) {
1568 NanDataPathInitiatorRequest msg_internal(msg);
1569 return global_func_table_.wifi_nan_data_request_initiator(id, getIfaceHandle(iface_name),
1570 &msg_internal);
1571}
1572
1573wifi_error WifiLegacyHal::nanDataIndicationResponse(const std::string& iface_name,
1574 transaction_id id,
1575 const NanDataPathIndicationResponse& msg) {
1576 NanDataPathIndicationResponse msg_internal(msg);
1577 return global_func_table_.wifi_nan_data_indication_response(id, getIfaceHandle(iface_name),
1578 &msg_internal);
1579}
1580
Nate Jiang38e8db52022-12-02 17:30:27 -08001581wifi_error WifiLegacyHal::nanPairingRequest(const std::string& iface_name, transaction_id id,
1582 const NanPairingRequest& msg) {
1583 NanPairingRequest msg_internal(msg);
1584 return global_func_table_.wifi_nan_pairing_request(id, getIfaceHandle(iface_name),
1585 &msg_internal);
1586}
1587
1588wifi_error WifiLegacyHal::nanPairingIndicationResponse(const std::string& iface_name,
1589 transaction_id id,
1590 const NanPairingIndicationResponse& msg) {
1591 NanPairingIndicationResponse msg_internal(msg);
1592 return global_func_table_.wifi_nan_pairing_indication_response(id, getIfaceHandle(iface_name),
1593 &msg_internal);
1594}
1595
1596wifi_error WifiLegacyHal::nanBootstrappingRequest(const std::string& iface_name, transaction_id id,
1597 const NanBootstrappingRequest& msg) {
1598 NanBootstrappingRequest msg_internal(msg);
1599 return global_func_table_.wifi_nan_bootstrapping_request(id, getIfaceHandle(iface_name),
1600 &msg_internal);
1601}
1602
1603wifi_error WifiLegacyHal::nanBootstrappingIndicationResponse(
1604 const std::string& iface_name, transaction_id id,
1605 const NanBootstrappingIndicationResponse& msg) {
1606 NanBootstrappingIndicationResponse msg_internal(msg);
1607 return global_func_table_.wifi_nan_bootstrapping_indication_response(
1608 id, getIfaceHandle(iface_name), &msg_internal);
1609}
1610
Gabriel Birenf3262f92022-07-15 23:25:39 +00001611typedef struct {
1612 u8 num_ndp_instances;
1613 NanDataPathId ndp_instance_id;
1614} NanDataPathEndSingleNdpIdRequest;
1615
1616wifi_error WifiLegacyHal::nanDataEnd(const std::string& iface_name, transaction_id id,
1617 uint32_t ndpInstanceId) {
1618 NanDataPathEndSingleNdpIdRequest msg;
1619 msg.num_ndp_instances = 1;
1620 msg.ndp_instance_id = ndpInstanceId;
1621 wifi_error status = global_func_table_.wifi_nan_data_end(id, getIfaceHandle(iface_name),
1622 (NanDataPathEndRequest*)&msg);
1623 return status;
1624}
1625
Nate Jiangbae6fdd2023-02-10 17:16:40 -08001626wifi_error WifiLegacyHal::nanPairingEnd(const std::string& iface_name, transaction_id id,
1627 uint32_t pairingId) {
1628 NanPairingEndRequest msg;
1629 msg.pairing_instance_id = pairingId;
1630 wifi_error status =
1631 global_func_table_.wifi_nan_pairing_end(id, getIfaceHandle(iface_name), &msg);
1632 return status;
1633}
1634
Phill Hayers02a97242022-12-15 16:05:14 +00001635wifi_error WifiLegacyHal::nanSuspendRequest(const std::string& iface_name, transaction_id id,
1636 const NanSuspendRequest& msg) {
1637 NanSuspendRequest msg_internal(msg);
1638 wifi_error status = global_func_table_.wifi_nan_suspend_request(id, getIfaceHandle(iface_name),
1639 &msg_internal);
1640 return status;
1641}
1642
1643wifi_error WifiLegacyHal::nanResumeRequest(const std::string& iface_name, transaction_id id,
1644 const NanResumeRequest& msg) {
1645 NanResumeRequest msg_internal(msg);
1646 wifi_error status = global_func_table_.wifi_nan_resume_request(id, getIfaceHandle(iface_name),
1647 &msg_internal);
1648 return status;
1649}
1650
Gabriel Birenf3262f92022-07-15 23:25:39 +00001651wifi_error WifiLegacyHal::setCountryCode(const std::string& iface_name,
1652 const std::array<uint8_t, 2> code) {
1653 std::string code_str(code.data(), code.data() + code.size());
1654 return global_func_table_.wifi_set_country_code(getIfaceHandle(iface_name), code_str.c_str());
1655}
1656
1657wifi_error WifiLegacyHal::retrieveIfaceHandles() {
1658 wifi_interface_handle* iface_handles = nullptr;
1659 int num_iface_handles = 0;
1660 wifi_error status =
1661 global_func_table_.wifi_get_ifaces(global_handle_, &num_iface_handles, &iface_handles);
1662 if (status != WIFI_SUCCESS) {
1663 LOG(ERROR) << "Failed to enumerate interface handles";
1664 return status;
1665 }
1666 iface_name_to_handle_.clear();
1667 for (int i = 0; i < num_iface_handles; ++i) {
1668 std::array<char, IFNAMSIZ> iface_name_arr = {};
1669 status = global_func_table_.wifi_get_iface_name(iface_handles[i], iface_name_arr.data(),
1670 iface_name_arr.size());
1671 if (status != WIFI_SUCCESS) {
1672 LOG(WARNING) << "Failed to get interface handle name";
1673 continue;
1674 }
1675 // Assuming the interface name is null terminated since the legacy HAL
1676 // API does not return a size.
1677 std::string iface_name(iface_name_arr.data());
1678 LOG(INFO) << "Adding interface handle for " << iface_name;
1679 iface_name_to_handle_[iface_name] = iface_handles[i];
1680 }
1681 return WIFI_SUCCESS;
1682}
1683
1684wifi_interface_handle WifiLegacyHal::getIfaceHandle(const std::string& iface_name) {
1685 const auto iface_handle_iter = iface_name_to_handle_.find(iface_name);
1686 if (iface_handle_iter == iface_name_to_handle_.end()) {
1687 LOG(ERROR) << "Unknown iface name: " << iface_name;
1688 return nullptr;
1689 }
1690 return iface_handle_iter->second;
1691}
1692
1693void WifiLegacyHal::runEventLoop() {
1694 LOG(DEBUG) << "Starting legacy HAL event loop";
1695 global_func_table_.wifi_event_loop(global_handle_);
1696 const auto lock = aidl_sync_util::acquireGlobalLock();
1697 if (!awaiting_event_loop_termination_) {
1698 LOG(FATAL) << "Legacy HAL event loop terminated, but HAL was not stopping";
1699 }
1700 LOG(DEBUG) << "Legacy HAL event loop terminated";
1701 awaiting_event_loop_termination_ = false;
1702 stop_wait_cv_.notify_one();
1703}
1704
1705std::pair<wifi_error, std::vector<wifi_cached_scan_results>> WifiLegacyHal::getGscanCachedResults(
1706 const std::string& iface_name) {
1707 std::vector<wifi_cached_scan_results> cached_scan_results;
1708 cached_scan_results.resize(kMaxCachedGscanResults);
1709 int32_t num_results = 0;
1710 wifi_error status = global_func_table_.wifi_get_cached_gscan_results(
1711 getIfaceHandle(iface_name), true /* always flush */, cached_scan_results.size(),
1712 cached_scan_results.data(), &num_results);
1713 CHECK(num_results >= 0 && static_cast<uint32_t>(num_results) <= kMaxCachedGscanResults);
1714 cached_scan_results.resize(num_results);
1715 // Check for invalid IE lengths in these cached scan results and correct it.
1716 for (auto& cached_scan_result : cached_scan_results) {
1717 int num_scan_results = cached_scan_result.num_results;
1718 for (int i = 0; i < num_scan_results; i++) {
1719 auto& scan_result = cached_scan_result.results[i];
1720 if (scan_result.ie_length > 0) {
1721 LOG(DEBUG) << "Cached scan result has non-zero IE length " << scan_result.ie_length;
1722 scan_result.ie_length = 0;
1723 }
1724 }
1725 }
1726 return {status, std::move(cached_scan_results)};
1727}
1728
1729wifi_error WifiLegacyHal::createVirtualInterface(const std::string& ifname,
1730 wifi_interface_type iftype) {
1731 // Create the interface if it doesn't exist. If interface already exist,
1732 // Vendor Hal should return WIFI_SUCCESS.
1733 wifi_error status = global_func_table_.wifi_virtual_interface_create(global_handle_,
1734 ifname.c_str(), iftype);
1735 return handleVirtualInterfaceCreateOrDeleteStatus(ifname, status);
1736}
1737
1738wifi_error WifiLegacyHal::deleteVirtualInterface(const std::string& ifname) {
1739 // Delete the interface if it was created dynamically.
1740 wifi_error status =
1741 global_func_table_.wifi_virtual_interface_delete(global_handle_, ifname.c_str());
1742 return handleVirtualInterfaceCreateOrDeleteStatus(ifname, status);
1743}
1744
1745wifi_error WifiLegacyHal::handleVirtualInterfaceCreateOrDeleteStatus(const std::string& ifname,
1746 wifi_error status) {
1747 if (status == WIFI_SUCCESS) {
1748 // refresh list of handlers now.
1749 status = retrieveIfaceHandles();
1750 } else if (status == WIFI_ERROR_NOT_SUPPORTED) {
1751 // Vendor hal does not implement this API. Such vendor implementations
1752 // are expected to create / delete interface by other means.
1753
1754 // check if interface exists.
1755 if (if_nametoindex(ifname.c_str())) {
1756 status = retrieveIfaceHandles();
1757 }
1758 }
1759 return status;
1760}
1761
1762wifi_error WifiLegacyHal::getSupportedIfaceName(uint32_t iface_type, std::string& ifname) {
1763 std::array<char, IFNAMSIZ> buffer;
1764
1765 wifi_error res = global_func_table_.wifi_get_supported_iface_name(
1766 global_handle_, (uint32_t)iface_type, buffer.data(), buffer.size());
1767 if (res == WIFI_SUCCESS) ifname = buffer.data();
1768
1769 return res;
1770}
1771
1772wifi_error WifiLegacyHal::multiStaSetPrimaryConnection(const std::string& ifname) {
1773 return global_func_table_.wifi_multi_sta_set_primary_connection(global_handle_,
1774 getIfaceHandle(ifname));
1775}
1776
1777wifi_error WifiLegacyHal::multiStaSetUseCase(wifi_multi_sta_use_case use_case) {
1778 return global_func_table_.wifi_multi_sta_set_use_case(global_handle_, use_case);
1779}
1780
1781wifi_error WifiLegacyHal::setCoexUnsafeChannels(
1782 std::vector<wifi_coex_unsafe_channel> unsafe_channels, uint32_t restrictions) {
1783 return global_func_table_.wifi_set_coex_unsafe_channels(global_handle_, unsafe_channels.size(),
1784 unsafe_channels.data(), restrictions);
1785}
1786
1787wifi_error WifiLegacyHal::setVoipMode(const std::string& iface_name, wifi_voip_mode mode) {
1788 return global_func_table_.wifi_set_voip_mode(getIfaceHandle(iface_name), mode);
1789}
1790
1791wifi_error WifiLegacyHal::twtRegisterHandler(const std::string& iface_name,
1792 const TwtCallbackHandlers& user_callbacks) {
1793 on_twt_event_setup_response_callback = user_callbacks.on_setup_response;
1794 on_twt_event_teardown_completion_callback = user_callbacks.on_teardown_completion;
1795 on_twt_event_info_frame_received_callback = user_callbacks.on_info_frame_received;
1796 on_twt_event_device_notify_callback = user_callbacks.on_device_notify;
1797
1798 return global_func_table_.wifi_twt_register_handler(
1799 getIfaceHandle(iface_name),
1800 {onAsyncTwtEventSetupResponse, onAsyncTwtEventTeardownCompletion,
1801 onAsyncTwtEventInfoFrameReceived, onAsyncTwtEventDeviceNotify});
1802}
1803
1804std::pair<wifi_error, TwtCapabilitySet> WifiLegacyHal::twtGetCapability(
1805 const std::string& iface_name) {
1806 TwtCapabilitySet capSet;
1807 wifi_error status =
1808 global_func_table_.wifi_twt_get_capability(getIfaceHandle(iface_name), &capSet);
1809 return {status, capSet};
1810}
1811
1812wifi_error WifiLegacyHal::twtSetupRequest(const std::string& iface_name,
1813 const TwtSetupRequest& msg) {
1814 TwtSetupRequest msgInternal(msg);
1815 return global_func_table_.wifi_twt_setup_request(getIfaceHandle(iface_name), &msgInternal);
1816}
1817
1818wifi_error WifiLegacyHal::twtTearDownRequest(const std::string& iface_name,
1819 const TwtTeardownRequest& msg) {
1820 TwtTeardownRequest msgInternal(msg);
1821 return global_func_table_.wifi_twt_teardown_request(getIfaceHandle(iface_name), &msgInternal);
1822}
1823
1824wifi_error WifiLegacyHal::twtInfoFrameRequest(const std::string& iface_name,
1825 const TwtInfoFrameRequest& msg) {
1826 TwtInfoFrameRequest msgInternal(msg);
1827 return global_func_table_.wifi_twt_info_frame_request(getIfaceHandle(iface_name), &msgInternal);
1828}
1829
1830std::pair<wifi_error, TwtStats> WifiLegacyHal::twtGetStats(const std::string& iface_name,
1831 uint8_t configId) {
1832 TwtStats stats;
1833 wifi_error status =
1834 global_func_table_.wifi_twt_get_stats(getIfaceHandle(iface_name), configId, &stats);
1835 return {status, stats};
1836}
1837
1838wifi_error WifiLegacyHal::twtClearStats(const std::string& iface_name, uint8_t configId) {
1839 return global_func_table_.wifi_twt_clear_stats(getIfaceHandle(iface_name), configId);
1840}
1841
Ye Jiao50274f72023-01-17 14:53:22 +08001842wifi_error WifiLegacyHal::setScanMode(const std::string& iface_name, bool enable) {
1843 return global_func_table_.wifi_set_scan_mode(iface_name.c_str(), enable);
1844}
1845
Gabriel Birenf3262f92022-07-15 23:25:39 +00001846wifi_error WifiLegacyHal::setDtimConfig(const std::string& iface_name, uint32_t multiplier) {
1847 return global_func_table_.wifi_set_dtim_config(getIfaceHandle(iface_name), multiplier);
1848}
1849
1850std::pair<wifi_error, std::vector<wifi_usable_channel>> WifiLegacyHal::getUsableChannels(
1851 uint32_t band_mask, uint32_t iface_mode_mask, uint32_t filter_mask) {
1852 std::vector<wifi_usable_channel> channels;
1853 channels.resize(kMaxWifiUsableChannels);
1854 uint32_t size = 0;
1855 wifi_error status = global_func_table_.wifi_get_usable_channels(
1856 global_handle_, band_mask, iface_mode_mask, filter_mask, channels.size(), &size,
1857 reinterpret_cast<wifi_usable_channel*>(channels.data()));
1858 CHECK(size >= 0 && size <= kMaxWifiUsableChannels);
1859 channels.resize(size);
1860 return {status, std::move(channels)};
1861}
1862
1863wifi_error WifiLegacyHal::triggerSubsystemRestart() {
1864 return global_func_table_.wifi_trigger_subsystem_restart(global_handle_);
1865}
1866
1867wifi_error WifiLegacyHal::setIndoorState(bool isIndoor) {
1868 return global_func_table_.wifi_set_indoor_state(global_handle_, isIndoor);
1869}
1870
1871std::pair<wifi_error, wifi_radio_combination_matrix*>
1872WifiLegacyHal::getSupportedRadioCombinationsMatrix() {
1873 char* buffer = new char[kMaxSupportedRadioCombinationsMatrixLength];
1874 std::fill(buffer, buffer + kMaxSupportedRadioCombinationsMatrixLength, 0);
1875 uint32_t size = 0;
1876 wifi_radio_combination_matrix* radio_combination_matrix_ptr =
1877 reinterpret_cast<wifi_radio_combination_matrix*>(buffer);
1878 wifi_error status = global_func_table_.wifi_get_supported_radio_combinations_matrix(
1879 global_handle_, kMaxSupportedRadioCombinationsMatrixLength, &size,
1880 radio_combination_matrix_ptr);
1881 CHECK(size >= 0 && size <= kMaxSupportedRadioCombinationsMatrixLength);
1882 return {status, radio_combination_matrix_ptr};
1883}
1884
1885wifi_error WifiLegacyHal::chreNanRttRequest(const std::string& iface_name, bool enable) {
1886 if (enable)
1887 return global_func_table_.wifi_nan_rtt_chre_enable_request(0, getIfaceHandle(iface_name),
1888 NULL);
1889 else
1890 return global_func_table_.wifi_nan_rtt_chre_disable_request(0, getIfaceHandle(iface_name));
1891}
1892
1893wifi_error WifiLegacyHal::chreRegisterHandler(const std::string& iface_name,
1894 const ChreCallbackHandlers& handler) {
1895 if (on_chre_nan_rtt_internal_callback) {
1896 return WIFI_ERROR_NOT_AVAILABLE;
1897 }
1898
1899 on_chre_nan_rtt_internal_callback = handler.on_wifi_chre_nan_rtt_state;
1900
1901 wifi_error status = global_func_table_.wifi_chre_register_handler(getIfaceHandle(iface_name),
1902 {onAsyncChreNanRttState});
1903 if (status != WIFI_SUCCESS) {
1904 on_chre_nan_rtt_internal_callback = nullptr;
1905 }
1906 return status;
1907}
1908
1909wifi_error WifiLegacyHal::enableWifiTxPowerLimits(const std::string& iface_name, bool enable) {
1910 return global_func_table_.wifi_enable_tx_power_limits(getIfaceHandle(iface_name), enable);
1911}
1912
1913wifi_error WifiLegacyHal::getWifiCachedScanResults(
1914 const std::string& iface_name, const CachedScanResultsCallbackHandlers& handler) {
1915 on_cached_scan_results_internal_callback = handler.on_cached_scan_results;
1916
1917 wifi_error status = global_func_table_.wifi_get_cached_scan_results(getIfaceHandle(iface_name),
1918 {onSyncCachedScanResults});
1919
1920 on_cached_scan_results_internal_callback = nullptr;
1921 return status;
1922}
1923
Mahesh KKVc84d3772022-12-02 16:53:28 -08001924std::pair<wifi_error, wifi_chip_capabilities> WifiLegacyHal::getWifiChipCapabilities() {
1925 wifi_chip_capabilities chip_capabilities;
1926 wifi_error status =
1927 global_func_table_.wifi_get_chip_capabilities(global_handle_, &chip_capabilities);
1928 return {status, chip_capabilities};
1929}
1930
Shuibing Daie5fbcab2022-12-19 15:37:19 -08001931wifi_error WifiLegacyHal::enableStaChannelForPeerNetwork(uint32_t channelCategoryEnableFlag) {
1932 return global_func_table_.wifi_enable_sta_channel_for_peer_network(global_handle_,
1933 channelCategoryEnableFlag);
1934}
1935
maheshkkva8aba172023-02-13 12:33:26 -08001936wifi_error WifiLegacyHal::setMloMode(wifi_mlo_mode mode) {
1937 return global_func_table_.wifi_set_mlo_mode(global_handle_, mode);
1938}
1939
Sunil Ravif68b9a22023-02-15 20:56:56 +00001940std::pair<wifi_error, wifi_iface_concurrency_matrix>
1941WifiLegacyHal::getSupportedIfaceConcurrencyMatrix() {
1942 wifi_iface_concurrency_matrix iface_concurrency_matrix;
1943 wifi_error status = global_func_table_.wifi_get_supported_iface_concurrency_matrix(
1944 global_handle_, &iface_concurrency_matrix);
1945 return {status, iface_concurrency_matrix};
1946}
1947
Gabriel Birenf3262f92022-07-15 23:25:39 +00001948void WifiLegacyHal::invalidate() {
1949 global_handle_ = nullptr;
1950 iface_name_to_handle_.clear();
1951 on_driver_memory_dump_internal_callback = nullptr;
1952 on_firmware_memory_dump_internal_callback = nullptr;
1953 on_gscan_event_internal_callback = nullptr;
1954 on_gscan_full_result_internal_callback = nullptr;
1955 on_link_layer_stats_result_internal_callback = nullptr;
Mahesh KKV5f30d332022-10-26 14:07:44 -07001956 on_link_layer_ml_stats_result_internal_callback = nullptr;
Gabriel Birenf3262f92022-07-15 23:25:39 +00001957 on_rssi_threshold_breached_internal_callback = nullptr;
1958 on_ring_buffer_data_internal_callback = nullptr;
1959 on_error_alert_internal_callback = nullptr;
1960 on_radio_mode_change_internal_callback = nullptr;
1961 on_subsystem_restart_internal_callback = nullptr;
Sunil Ravif8fc2372022-11-10 18:37:41 +00001962 invalidateRttResultsCallbacks();
Gabriel Birenf3262f92022-07-15 23:25:39 +00001963 on_nan_notify_response_user_callback = nullptr;
1964 on_nan_event_publish_terminated_user_callback = nullptr;
1965 on_nan_event_match_user_callback = nullptr;
1966 on_nan_event_match_expired_user_callback = nullptr;
1967 on_nan_event_subscribe_terminated_user_callback = nullptr;
1968 on_nan_event_followup_user_callback = nullptr;
1969 on_nan_event_disc_eng_event_user_callback = nullptr;
1970 on_nan_event_disabled_user_callback = nullptr;
1971 on_nan_event_tca_user_callback = nullptr;
1972 on_nan_event_beacon_sdf_payload_user_callback = nullptr;
1973 on_nan_event_data_path_request_user_callback = nullptr;
Nate Jiang38e8db52022-12-02 17:30:27 -08001974 on_nan_event_pairing_request_user_callback = nullptr;
1975 on_nan_event_pairing_confirm_user_callback = nullptr;
1976 on_nan_event_bootstrapping_request_user_callback = nullptr;
1977 on_nan_event_bootstrapping_confirm_user_callback = nullptr;
Gabriel Birenf3262f92022-07-15 23:25:39 +00001978 on_nan_event_data_path_confirm_user_callback = nullptr;
1979 on_nan_event_data_path_end_user_callback = nullptr;
1980 on_nan_event_transmit_follow_up_user_callback = nullptr;
1981 on_nan_event_range_request_user_callback = nullptr;
1982 on_nan_event_range_report_user_callback = nullptr;
1983 on_nan_event_schedule_update_user_callback = nullptr;
1984 on_twt_event_setup_response_callback = nullptr;
1985 on_twt_event_teardown_completion_callback = nullptr;
1986 on_twt_event_info_frame_received_callback = nullptr;
1987 on_twt_event_device_notify_callback = nullptr;
1988 on_chre_nan_rtt_internal_callback = nullptr;
1989}
1990
1991} // namespace legacy_hal
1992} // namespace wifi
1993} // namespace hardware
1994} // namespace android
1995} // namespace aidl