1 /*
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
29 namespace {
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.
34 static constexpr uint32_t kMaxVersionStringLength = 256;
35 static constexpr uint32_t kMaxCachedGscanResults = 64;
36 static constexpr uint32_t kMaxGscanFrequenciesForBand = 64;
37 static constexpr uint32_t kLinkLayerStatsDataMpduSizeThreshold = 128;
38 static constexpr uint32_t kMaxWakeReasonStatsArraySize = 32;
39 static constexpr uint32_t kMaxRingBuffers = 10;
40 static constexpr uint32_t kMaxWifiUsableChannels = 256;
41 static constexpr uint32_t kMaxSupportedRadioCombinationsMatrixLength = 256;
42 // Need a long timeout (1000ms) for chips that unload their driver.
43 static constexpr uint32_t kMaxStopCompleteWaitMs = 1000;
44 static constexpr char kDriverPropName[] = "wlan.driver.status";
45
46 // Helper function to create a non-const char* for legacy Hal API's.
makeCharVec(const std::string & str)47 std::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
55 namespace aidl {
56 namespace android {
57 namespace hardware {
58 namespace wifi {
59 namespace 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
66 std::function<void(wifi_handle handle)> on_stop_complete_internal_callback;
onAsyncStopComplete(wifi_handle handle)67 void 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.
77 std::function<void(char*, int)> on_driver_memory_dump_internal_callback;
onSyncDriverMemoryDump(char * buffer,int buffer_size)78 void 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.
85 std::function<void(char*, int)> on_firmware_memory_dump_internal_callback;
onSyncFirmwareMemoryDump(char * buffer,int buffer_size)86 void 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.
93 std::function<void(wifi_request_id, wifi_scan_event)> on_gscan_event_internal_callback;
onAsyncGscanEvent(wifi_request_id id,wifi_scan_event event)94 void 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.
102 std::function<void(wifi_request_id, wifi_scan_result*, uint32_t)>
103 on_gscan_full_result_internal_callback;
onAsyncGscanFullResult(wifi_request_id id,wifi_scan_result * result,uint32_t buckets_scanned)104 void 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.
113 std::function<void((wifi_request_id, wifi_iface_stat*, int, wifi_radio_stat*))>
114 on_link_layer_stats_result_internal_callback;
onSyncLinkLayerStatsResult(wifi_request_id id,wifi_iface_stat * iface_stat,int num_radios,wifi_radio_stat * radio_stat)115 void 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
122 // Callback to be invoked for Multi link layer stats results.
123 std::function<void((wifi_request_id, wifi_iface_ml_stat*, int, wifi_radio_stat*))>
124 on_link_layer_ml_stats_result_internal_callback;
onSyncLinkLayerMlStatsResult(wifi_request_id id,wifi_iface_ml_stat * iface_ml_stat,int num_radios,wifi_radio_stat * radio_stat)125 void 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
132 // Callback to be invoked for rssi threshold breach.
133 std::function<void((wifi_request_id, uint8_t*, int8_t))>
134 on_rssi_threshold_breached_internal_callback;
onAsyncRssiThresholdBreached(wifi_request_id id,uint8_t * bssid,int8_t rssi)135 void 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.
143 std::function<void(char*, char*, int, wifi_ring_buffer_status*)>
144 on_ring_buffer_data_internal_callback;
onAsyncRingBufferData(char * ring_name,char * buffer,int buffer_size,wifi_ring_buffer_status * status)145 void 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.
154 std::function<void(wifi_request_id, char*, int, int)> on_error_alert_internal_callback;
onAsyncErrorAlert(wifi_request_id id,char * buffer,int buffer_size,int err_code)155 void 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.
163 std::function<void(wifi_request_id, uint32_t, wifi_mac_info*)>
164 on_radio_mode_change_internal_callback;
onAsyncRadioModeChange(wifi_request_id id,uint32_t num_macs,wifi_mac_info * mac_infos)165 void 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
173 std::function<void(const char*)> on_subsystem_restart_internal_callback;
onAsyncSubsystemRestart(const char * error)174 void 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.
182 std::function<void(wifi_request_id, unsigned num_results, wifi_rtt_result* rtt_results[])>
183 on_rtt_results_internal_callback;
184 std::function<void(wifi_request_id, unsigned num_results, wifi_rtt_result_v2* rtt_results_v2[])>
185 on_rtt_results_internal_callback_v2;
186 std::function<void(wifi_request_id, unsigned num_results, wifi_rtt_result_v3* rtt_results_v3[])>
187 on_rtt_results_internal_callback_v3;
188
invalidateRttResultsCallbacks()189 void invalidateRttResultsCallbacks() {
190 on_rtt_results_internal_callback = nullptr;
191 on_rtt_results_internal_callback_v2 = nullptr;
192 on_rtt_results_internal_callback_v3 = nullptr;
193 };
194
onAsyncRttResults(wifi_request_id id,unsigned num_results,wifi_rtt_result * rtt_results[])195 void 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);
199 invalidateRttResultsCallbacks();
200 }
201 }
202
onAsyncRttResultsV2(wifi_request_id id,unsigned num_results,wifi_rtt_result_v2 * rtt_results_v2[])203 void 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();
209 }
210 }
211
onAsyncRttResultsV3(wifi_request_id id,unsigned num_results,wifi_rtt_result_v3 * rtt_results_v3[])212 void 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
221 // 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.
225 std::function<void(transaction_id, const NanResponseMsg&)> on_nan_notify_response_user_callback;
onAsyncNanNotifyResponse(transaction_id id,NanResponseMsg * msg)226 void 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
233 std::function<void(const NanPublishRepliedInd&)> on_nan_event_publish_replied_user_callback;
onAsyncNanEventPublishReplied(NanPublishRepliedInd *)234 void onAsyncNanEventPublishReplied(NanPublishRepliedInd* /* event */) {
235 LOG(ERROR) << "onAsyncNanEventPublishReplied triggered";
236 }
237
238 std::function<void(const NanPublishTerminatedInd&)> on_nan_event_publish_terminated_user_callback;
onAsyncNanEventPublishTerminated(NanPublishTerminatedInd * event)239 void 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
246 std::function<void(const NanMatchInd&)> on_nan_event_match_user_callback;
onAsyncNanEventMatch(NanMatchInd * event)247 void 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
254 std::function<void(const NanMatchExpiredInd&)> on_nan_event_match_expired_user_callback;
onAsyncNanEventMatchExpired(NanMatchExpiredInd * event)255 void 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
262 std::function<void(const NanSubscribeTerminatedInd&)>
263 on_nan_event_subscribe_terminated_user_callback;
onAsyncNanEventSubscribeTerminated(NanSubscribeTerminatedInd * event)264 void 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
271 std::function<void(const NanFollowupInd&)> on_nan_event_followup_user_callback;
onAsyncNanEventFollowup(NanFollowupInd * event)272 void 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
279 std::function<void(const NanDiscEngEventInd&)> on_nan_event_disc_eng_event_user_callback;
onAsyncNanEventDiscEngEvent(NanDiscEngEventInd * event)280 void 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
287 std::function<void(const NanDisabledInd&)> on_nan_event_disabled_user_callback;
onAsyncNanEventDisabled(NanDisabledInd * event)288 void 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
295 std::function<void(const NanTCAInd&)> on_nan_event_tca_user_callback;
onAsyncNanEventTca(NanTCAInd * event)296 void 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
303 std::function<void(const NanBeaconSdfPayloadInd&)> on_nan_event_beacon_sdf_payload_user_callback;
onAsyncNanEventBeaconSdfPayload(NanBeaconSdfPayloadInd * event)304 void 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
311 std::function<void(const NanDataPathRequestInd&)> on_nan_event_data_path_request_user_callback;
onAsyncNanEventDataPathRequest(NanDataPathRequestInd * event)312 void 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 }
318 std::function<void(const NanDataPathConfirmInd&)> on_nan_event_data_path_confirm_user_callback;
onAsyncNanEventDataPathConfirm(NanDataPathConfirmInd * event)319 void 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
326 std::function<void(const NanDataPathEndInd&)> on_nan_event_data_path_end_user_callback;
onAsyncNanEventDataPathEnd(NanDataPathEndInd * event)327 void 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
334 std::function<void(const NanTransmitFollowupInd&)> on_nan_event_transmit_follow_up_user_callback;
onAsyncNanEventTransmitFollowUp(NanTransmitFollowupInd * event)335 void 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
342 std::function<void(const NanRangeRequestInd&)> on_nan_event_range_request_user_callback;
onAsyncNanEventRangeRequest(NanRangeRequestInd * event)343 void 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
350 std::function<void(const NanRangeReportInd&)> on_nan_event_range_report_user_callback;
onAsyncNanEventRangeReport(NanRangeReportInd * event)351 void 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
358 std::function<void(const NanDataPathScheduleUpdateInd&)> on_nan_event_schedule_update_user_callback;
onAsyncNanEventScheduleUpdate(NanDataPathScheduleUpdateInd * event)359 void 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
366 std::function<void(const NanSuspensionModeChangeInd&)>
367 on_nan_event_suspension_mode_change_user_callback;
onAsyncNanEventSuspensionModeChange(NanSuspensionModeChangeInd * event)368 void 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
375 std::function<void(wifi_rtt_result* rtt_results[], uint32_t num_results, uint16_t session_id)>
376 on_nan_event_ranging_results_callback;
onAsyncNanEventRangingResults(wifi_rtt_result * rtt_results[],uint32_t num_results,uint16_t session_id)377 void onAsyncNanEventRangingResults(wifi_rtt_result* rtt_results[], uint32_t num_results,
378 uint16_t session_id) {
379 const auto lock = aidl_sync_util::acquireGlobalLock();
380 if (on_nan_event_ranging_results_callback && rtt_results) {
381 on_nan_event_ranging_results_callback(rtt_results, num_results, session_id);
382 }
383 }
384
385 std::function<void(const NanPairingRequestInd&)> on_nan_event_pairing_request_user_callback;
onAsyncNanEventPairingRequest(NanPairingRequestInd * event)386 void onAsyncNanEventPairingRequest(NanPairingRequestInd* event) {
387 const auto lock = aidl_sync_util::acquireGlobalLock();
388 if (on_nan_event_pairing_request_user_callback && event) {
389 on_nan_event_pairing_request_user_callback(*event);
390 }
391 }
392
393 std::function<void(const NanPairingConfirmInd&)> on_nan_event_pairing_confirm_user_callback;
onAsyncNanEventPairingConfirm(NanPairingConfirmInd * event)394 void onAsyncNanEventPairingConfirm(NanPairingConfirmInd* event) {
395 const auto lock = aidl_sync_util::acquireGlobalLock();
396 if (on_nan_event_pairing_confirm_user_callback && event) {
397 on_nan_event_pairing_confirm_user_callback(*event);
398 }
399 }
400
401 std::function<void(const NanBootstrappingRequestInd&)>
402 on_nan_event_bootstrapping_request_user_callback;
onAsyncNanEventBootstrappingRequest(NanBootstrappingRequestInd * event)403 void onAsyncNanEventBootstrappingRequest(NanBootstrappingRequestInd* event) {
404 const auto lock = aidl_sync_util::acquireGlobalLock();
405 if (on_nan_event_bootstrapping_request_user_callback && event) {
406 on_nan_event_bootstrapping_request_user_callback(*event);
407 }
408 }
409
410 std::function<void(const NanBootstrappingConfirmInd&)>
411 on_nan_event_bootstrapping_confirm_user_callback;
onAsyncNanEventBootstrappingConfirm(NanBootstrappingConfirmInd * event)412 void onAsyncNanEventBootstrappingConfirm(NanBootstrappingConfirmInd* event) {
413 const auto lock = aidl_sync_util::acquireGlobalLock();
414 if (on_nan_event_bootstrapping_confirm_user_callback && event) {
415 on_nan_event_bootstrapping_confirm_user_callback(*event);
416 }
417 }
418
419 // Callbacks for the various TWT operations.
420 std::function<void(const TwtSetupResponse&)> on_twt_event_setup_response_callback;
onAsyncTwtEventSetupResponse(TwtSetupResponse * event)421 void onAsyncTwtEventSetupResponse(TwtSetupResponse* event) {
422 const auto lock = aidl_sync_util::acquireGlobalLock();
423 if (on_twt_event_setup_response_callback && event) {
424 on_twt_event_setup_response_callback(*event);
425 }
426 }
427
428 std::function<void(const TwtTeardownCompletion&)> on_twt_event_teardown_completion_callback;
onAsyncTwtEventTeardownCompletion(TwtTeardownCompletion * event)429 void onAsyncTwtEventTeardownCompletion(TwtTeardownCompletion* event) {
430 const auto lock = aidl_sync_util::acquireGlobalLock();
431 if (on_twt_event_teardown_completion_callback && event) {
432 on_twt_event_teardown_completion_callback(*event);
433 }
434 }
435
436 std::function<void(const TwtInfoFrameReceived&)> on_twt_event_info_frame_received_callback;
onAsyncTwtEventInfoFrameReceived(TwtInfoFrameReceived * event)437 void onAsyncTwtEventInfoFrameReceived(TwtInfoFrameReceived* event) {
438 const auto lock = aidl_sync_util::acquireGlobalLock();
439 if (on_twt_event_info_frame_received_callback && event) {
440 on_twt_event_info_frame_received_callback(*event);
441 }
442 }
443
444 std::function<void(const TwtDeviceNotify&)> on_twt_event_device_notify_callback;
onAsyncTwtEventDeviceNotify(TwtDeviceNotify * event)445 void onAsyncTwtEventDeviceNotify(TwtDeviceNotify* event) {
446 const auto lock = aidl_sync_util::acquireGlobalLock();
447 if (on_twt_event_device_notify_callback && event) {
448 on_twt_event_device_notify_callback(*event);
449 }
450 }
451
452 // Callback to report current CHRE NAN state
453 std::function<void(chre_nan_rtt_state)> on_chre_nan_rtt_internal_callback;
onAsyncChreNanRttState(chre_nan_rtt_state state)454 void onAsyncChreNanRttState(chre_nan_rtt_state state) {
455 const auto lock = aidl_sync_util::acquireGlobalLock();
456 if (on_chre_nan_rtt_internal_callback) {
457 on_chre_nan_rtt_internal_callback(state);
458 }
459 }
460
461 // Callback to report cached scan results
462 std::function<void(wifi_cached_scan_report*)> on_cached_scan_results_internal_callback;
onSyncCachedScanResults(wifi_cached_scan_report * cache_report)463 void onSyncCachedScanResults(wifi_cached_scan_report* cache_report) {
464 const auto lock = aidl_sync_util::acquireGlobalLock();
465 if (on_cached_scan_results_internal_callback) {
466 on_cached_scan_results_internal_callback(cache_report);
467 }
468 }
469
470 // Callback to be invoked for TWT failure
471 std::function<void((wifi_request_id, wifi_twt_error_code error_code))>
472 on_twt_failure_internal_callback;
onAsyncTwtError(wifi_request_id id,wifi_twt_error_code error_code)473 void onAsyncTwtError(wifi_request_id id, wifi_twt_error_code error_code) {
474 const auto lock = aidl_sync_util::acquireGlobalLock();
475 if (on_twt_failure_internal_callback) {
476 on_twt_failure_internal_callback(id, error_code);
477 }
478 }
479
480 // Callback to be invoked for TWT session creation
481 std::function<void((wifi_request_id, wifi_twt_session twt_session))>
482 on_twt_session_create_internal_callback;
onAsyncTwtSessionCreate(wifi_request_id id,wifi_twt_session twt_session)483 void onAsyncTwtSessionCreate(wifi_request_id id, wifi_twt_session twt_session) {
484 const auto lock = aidl_sync_util::acquireGlobalLock();
485 if (on_twt_session_create_internal_callback) {
486 on_twt_session_create_internal_callback(id, twt_session);
487 }
488 }
489
490 // Callback to be invoked for TWT session update
491 std::function<void((wifi_request_id, wifi_twt_session twt_session))>
492 on_twt_session_update_internal_callback;
onAsyncTwtSessionUpdate(wifi_request_id id,wifi_twt_session twt_session)493 void onAsyncTwtSessionUpdate(wifi_request_id id, wifi_twt_session twt_session) {
494 const auto lock = aidl_sync_util::acquireGlobalLock();
495 if (on_twt_session_update_internal_callback) {
496 on_twt_session_update_internal_callback(id, twt_session);
497 }
498 }
499
500 // Callback to be invoked for TWT session teardown
501 std::function<void(
502 (wifi_request_id, int twt_session_id, wifi_twt_teardown_reason_code reason_code))>
503 on_twt_session_teardown_internal_callback;
onAsyncTwtSessionTeardown(wifi_request_id id,int twt_session_id,wifi_twt_teardown_reason_code reason_code)504 void onAsyncTwtSessionTeardown(wifi_request_id id, int twt_session_id,
505 wifi_twt_teardown_reason_code reason_code) {
506 const auto lock = aidl_sync_util::acquireGlobalLock();
507 if (on_twt_session_teardown_internal_callback) {
508 on_twt_session_teardown_internal_callback(id, twt_session_id, reason_code);
509 }
510 }
511
512 // Callback to be invoked for TWT session get stats
513 std::function<void((wifi_request_id, int twt_session_id, wifi_twt_session_stats stats))>
514 on_twt_session_stats_internal_callback;
onAsyncTwtSessionStats(wifi_request_id id,int twt_session_id,wifi_twt_session_stats stats)515 void onAsyncTwtSessionStats(wifi_request_id id, int twt_session_id, wifi_twt_session_stats stats) {
516 const auto lock = aidl_sync_util::acquireGlobalLock();
517 if (on_twt_session_stats_internal_callback) {
518 on_twt_session_stats_internal_callback(id, twt_session_id, stats);
519 }
520 }
521
522 // Callback to be invoked for TWT session suspend
523 std::function<void((wifi_request_id, int twt_session_id))> on_twt_session_suspend_internal_callback;
onAsyncTwtSessionSuspend(wifi_request_id id,int twt_session_id)524 void onAsyncTwtSessionSuspend(wifi_request_id id, int twt_session_id) {
525 const auto lock = aidl_sync_util::acquireGlobalLock();
526 if (on_twt_session_suspend_internal_callback) {
527 on_twt_session_suspend_internal_callback(id, twt_session_id);
528 }
529 }
530
531 // Callback to be invoked for TWT session resume
532 std::function<void((wifi_request_id, int twt_session_id))> on_twt_session_resume_internal_callback;
onAsyncTwtSessionResume(wifi_request_id id,int twt_session_id)533 void onAsyncTwtSessionResume(wifi_request_id id, int twt_session_id) {
534 const auto lock = aidl_sync_util::acquireGlobalLock();
535 if (on_twt_session_resume_internal_callback) {
536 on_twt_session_resume_internal_callback(id, twt_session_id);
537 }
538 }
539
540 // End of the free-standing "C" style callbacks.
541
WifiLegacyHal(const std::weak_ptr<::android::wifi_system::InterfaceTool> iface_tool,const wifi_hal_fn & fn,bool is_primary)542 WifiLegacyHal::WifiLegacyHal(const std::weak_ptr<::android::wifi_system::InterfaceTool> iface_tool,
543 const wifi_hal_fn& fn, bool is_primary)
544 : global_func_table_(fn),
545 global_handle_(nullptr),
546 awaiting_event_loop_termination_(false),
547 is_started_(false),
548 iface_tool_(iface_tool),
549 is_primary_(is_primary) {}
550
initialize()551 wifi_error WifiLegacyHal::initialize() {
552 LOG(DEBUG) << "Initialize legacy HAL";
553 // this now does nothing, since HAL function table is provided
554 // to the constructor
555 return WIFI_SUCCESS;
556 }
557
start()558 wifi_error WifiLegacyHal::start() {
559 // Ensure that we're starting in a good state.
560 CHECK(global_func_table_.wifi_initialize && !global_handle_ && iface_name_to_handle_.empty() &&
561 !awaiting_event_loop_termination_);
562 if (is_started_) {
563 LOG(DEBUG) << "Legacy HAL already started";
564 return WIFI_SUCCESS;
565 }
566 LOG(DEBUG) << "Waiting for the driver ready";
567 wifi_error status = global_func_table_.wifi_wait_for_driver_ready();
568 if (status == WIFI_ERROR_TIMED_OUT || status == WIFI_ERROR_UNKNOWN) {
569 LOG(ERROR) << "Failed or timed out awaiting driver ready";
570 return status;
571 }
572
573 if (is_primary_) {
574 property_set(kDriverPropName, "ok");
575
576 if (!iface_tool_.lock()->SetWifiUpState(true)) {
577 LOG(ERROR) << "Failed to set WiFi interface up";
578 return WIFI_ERROR_UNKNOWN;
579 }
580 }
581
582 LOG(DEBUG) << "Starting legacy HAL";
583 status = global_func_table_.wifi_initialize(&global_handle_);
584 if (status != WIFI_SUCCESS || !global_handle_) {
585 LOG(ERROR) << "Failed to retrieve global handle";
586 return status;
587 }
588 std::thread(&WifiLegacyHal::runEventLoop, this).detach();
589 status = retrieveIfaceHandles();
590 if (status != WIFI_SUCCESS || iface_name_to_handle_.empty()) {
591 LOG(ERROR) << "Failed to retrieve wlan interface handle";
592 return status;
593 }
594 LOG(DEBUG) << "Legacy HAL start complete";
595 is_started_ = true;
596 return WIFI_SUCCESS;
597 }
598
stop(std::unique_lock<std::recursive_mutex> * lock,const std::function<void ()> & on_stop_complete_user_callback)599 wifi_error WifiLegacyHal::stop(
600 /* NONNULL */ std::unique_lock<std::recursive_mutex>* lock,
601 const std::function<void()>& on_stop_complete_user_callback) {
602 if (!is_started_) {
603 LOG(DEBUG) << "Legacy HAL already stopped";
604 on_stop_complete_user_callback();
605 return WIFI_SUCCESS;
606 }
607 LOG(DEBUG) << "Stopping legacy HAL";
608 on_stop_complete_internal_callback = [on_stop_complete_user_callback,
609 this](wifi_handle handle) {
610 CHECK_EQ(global_handle_, handle) << "Handle mismatch";
611 LOG(INFO) << "Legacy HAL stop complete callback received";
612 // Invalidate all the internal pointers now that the HAL is
613 // stopped.
614 invalidate();
615 if (is_primary_) iface_tool_.lock()->SetWifiUpState(false);
616 on_stop_complete_user_callback();
617 is_started_ = false;
618 };
619 awaiting_event_loop_termination_ = true;
620 global_func_table_.wifi_cleanup(global_handle_, onAsyncStopComplete);
621 const auto status =
622 stop_wait_cv_.wait_for(*lock, std::chrono::milliseconds(kMaxStopCompleteWaitMs),
623 [this] { return !awaiting_event_loop_termination_; });
624 if (!status) {
625 LOG(ERROR) << "Legacy HAL stop failed or timed out";
626 return WIFI_ERROR_UNKNOWN;
627 }
628 LOG(DEBUG) << "Legacy HAL stop complete";
629 return WIFI_SUCCESS;
630 }
631
isStarted()632 bool WifiLegacyHal::isStarted() {
633 return is_started_;
634 }
635
waitForDriverReady()636 wifi_error WifiLegacyHal::waitForDriverReady() {
637 return global_func_table_.wifi_wait_for_driver_ready();
638 }
639
getDriverVersion(const std::string & iface_name)640 std::pair<wifi_error, std::string> WifiLegacyHal::getDriverVersion(const std::string& iface_name) {
641 std::array<char, kMaxVersionStringLength> buffer;
642 buffer.fill(0);
643 wifi_error status = global_func_table_.wifi_get_driver_version(getIfaceHandle(iface_name),
644 buffer.data(), buffer.size());
645 return {status, buffer.data()};
646 }
647
getFirmwareVersion(const std::string & iface_name)648 std::pair<wifi_error, std::string> WifiLegacyHal::getFirmwareVersion(
649 const std::string& iface_name) {
650 std::array<char, kMaxVersionStringLength> buffer;
651 buffer.fill(0);
652 wifi_error status = global_func_table_.wifi_get_firmware_version(getIfaceHandle(iface_name),
653 buffer.data(), buffer.size());
654 return {status, buffer.data()};
655 }
656
requestDriverMemoryDump(const std::string & iface_name)657 std::pair<wifi_error, std::vector<uint8_t>> WifiLegacyHal::requestDriverMemoryDump(
658 const std::string& iface_name) {
659 std::vector<uint8_t> driver_dump;
660 on_driver_memory_dump_internal_callback = [&driver_dump](char* buffer, int buffer_size) {
661 driver_dump.insert(driver_dump.end(), reinterpret_cast<uint8_t*>(buffer),
662 reinterpret_cast<uint8_t*>(buffer) + buffer_size);
663 };
664 wifi_error status = global_func_table_.wifi_get_driver_memory_dump(getIfaceHandle(iface_name),
665 {onSyncDriverMemoryDump});
666 on_driver_memory_dump_internal_callback = nullptr;
667 return {status, std::move(driver_dump)};
668 }
669
requestFirmwareMemoryDump(const std::string & iface_name)670 std::pair<wifi_error, std::vector<uint8_t>> WifiLegacyHal::requestFirmwareMemoryDump(
671 const std::string& iface_name) {
672 std::vector<uint8_t> firmware_dump;
673 on_firmware_memory_dump_internal_callback = [&firmware_dump](char* buffer, int buffer_size) {
674 firmware_dump.insert(firmware_dump.end(), reinterpret_cast<uint8_t*>(buffer),
675 reinterpret_cast<uint8_t*>(buffer) + buffer_size);
676 };
677 wifi_error status = global_func_table_.wifi_get_firmware_memory_dump(
678 getIfaceHandle(iface_name), {onSyncFirmwareMemoryDump});
679 on_firmware_memory_dump_internal_callback = nullptr;
680 return {status, std::move(firmware_dump)};
681 }
682
getSupportedFeatureSet(const std::string & iface_name)683 std::pair<wifi_error, uint64_t> WifiLegacyHal::getSupportedFeatureSet(
684 const std::string& iface_name) {
685 feature_set set = 0, chip_set = 0;
686 wifi_error status = WIFI_SUCCESS;
687
688 static_assert(sizeof(set) == sizeof(uint64_t),
689 "Some feature_flags can not be represented in output");
690 wifi_interface_handle iface_handle = getIfaceHandle(iface_name);
691
692 global_func_table_.wifi_get_chip_feature_set(
693 global_handle_, &chip_set); /* ignore error, chip_set will stay 0 */
694
695 if (iface_handle) {
696 status = global_func_table_.wifi_get_supported_feature_set(iface_handle, &set);
697 }
698 return {status, static_cast<uint64_t>(set | chip_set)};
699 }
700
getPacketFilterCapabilities(const std::string & iface_name)701 std::pair<wifi_error, PacketFilterCapabilities> WifiLegacyHal::getPacketFilterCapabilities(
702 const std::string& iface_name) {
703 PacketFilterCapabilities caps;
704 wifi_error status = global_func_table_.wifi_get_packet_filter_capabilities(
705 getIfaceHandle(iface_name), &caps.version, &caps.max_len);
706 return {status, caps};
707 }
708
setPacketFilter(const std::string & iface_name,const std::vector<uint8_t> & program)709 wifi_error WifiLegacyHal::setPacketFilter(const std::string& iface_name,
710 const std::vector<uint8_t>& program) {
711 return global_func_table_.wifi_set_packet_filter(getIfaceHandle(iface_name), program.data(),
712 program.size());
713 }
714
readApfPacketFilterData(const std::string & iface_name)715 std::pair<wifi_error, std::vector<uint8_t>> WifiLegacyHal::readApfPacketFilterData(
716 const std::string& iface_name) {
717 PacketFilterCapabilities caps;
718 wifi_error status = global_func_table_.wifi_get_packet_filter_capabilities(
719 getIfaceHandle(iface_name), &caps.version, &caps.max_len);
720 if (status != WIFI_SUCCESS) {
721 return {status, {}};
722 }
723
724 // Size the buffer to read the entire program & work memory.
725 std::vector<uint8_t> buffer(caps.max_len);
726
727 status = global_func_table_.wifi_read_packet_filter(
728 getIfaceHandle(iface_name), /*src_offset=*/0, buffer.data(), buffer.size());
729 return {status, std::move(buffer)};
730 }
731
getGscanCapabilities(const std::string & iface_name)732 std::pair<wifi_error, wifi_gscan_capabilities> WifiLegacyHal::getGscanCapabilities(
733 const std::string& iface_name) {
734 wifi_gscan_capabilities caps;
735 wifi_error status =
736 global_func_table_.wifi_get_gscan_capabilities(getIfaceHandle(iface_name), &caps);
737 return {status, caps};
738 }
739
startGscan(const std::string & iface_name,wifi_request_id id,const wifi_scan_cmd_params & params,const std::function<void (wifi_request_id)> & on_failure_user_callback,const on_gscan_results_callback & on_results_user_callback,const on_gscan_full_result_callback & on_full_result_user_callback)740 wifi_error WifiLegacyHal::startGscan(
741 const std::string& iface_name, wifi_request_id id, const wifi_scan_cmd_params& params,
742 const std::function<void(wifi_request_id)>& on_failure_user_callback,
743 const on_gscan_results_callback& on_results_user_callback,
744 const on_gscan_full_result_callback& on_full_result_user_callback) {
745 // If there is already an ongoing background scan, reject new scan requests.
746 if (on_gscan_event_internal_callback || on_gscan_full_result_internal_callback) {
747 return WIFI_ERROR_NOT_AVAILABLE;
748 }
749
750 // This callback will be used to either trigger |on_results_user_callback|
751 // or |on_failure_user_callback|.
752 on_gscan_event_internal_callback = [iface_name, on_failure_user_callback,
753 on_results_user_callback,
754 this](wifi_request_id id, wifi_scan_event event) {
755 switch (event) {
756 case WIFI_SCAN_RESULTS_AVAILABLE:
757 case WIFI_SCAN_THRESHOLD_NUM_SCANS:
758 case WIFI_SCAN_THRESHOLD_PERCENT: {
759 wifi_error status;
760 std::vector<wifi_cached_scan_results> cached_scan_results;
761 std::tie(status, cached_scan_results) = getGscanCachedResults(iface_name);
762 if (status == WIFI_SUCCESS) {
763 on_results_user_callback(id, cached_scan_results);
764 return;
765 }
766 FALLTHROUGH_INTENDED;
767 }
768 // Fall through if failed. Failure to retrieve cached scan
769 // results should trigger a background scan failure.
770 case WIFI_SCAN_FAILED:
771 on_failure_user_callback(id);
772 on_gscan_event_internal_callback = nullptr;
773 on_gscan_full_result_internal_callback = nullptr;
774 return;
775 }
776 LOG(FATAL) << "Unexpected gscan event received: " << event;
777 };
778
779 on_gscan_full_result_internal_callback = [on_full_result_user_callback](
780 wifi_request_id id, wifi_scan_result* result,
781 uint32_t buckets_scanned) {
782 if (result) {
783 on_full_result_user_callback(id, result, buckets_scanned);
784 }
785 };
786
787 wifi_scan_result_handler handler = {onAsyncGscanFullResult, onAsyncGscanEvent};
788 wifi_error status =
789 global_func_table_.wifi_start_gscan(id, getIfaceHandle(iface_name), params, handler);
790 if (status != WIFI_SUCCESS) {
791 on_gscan_event_internal_callback = nullptr;
792 on_gscan_full_result_internal_callback = nullptr;
793 }
794 return status;
795 }
796
stopGscan(const std::string & iface_name,wifi_request_id id)797 wifi_error WifiLegacyHal::stopGscan(const std::string& iface_name, wifi_request_id id) {
798 // If there is no an ongoing background scan, reject stop requests.
799 // TODO(b/32337212): This needs to be handled by the HIDL object because we
800 // need to return the NOT_STARTED error code.
801 if (!on_gscan_event_internal_callback && !on_gscan_full_result_internal_callback) {
802 return WIFI_ERROR_NOT_AVAILABLE;
803 }
804 wifi_error status = global_func_table_.wifi_stop_gscan(id, getIfaceHandle(iface_name));
805 // If the request Id is wrong, don't stop the ongoing background scan. Any
806 // other error should be treated as the end of background scan.
807 if (status != WIFI_ERROR_INVALID_REQUEST_ID) {
808 on_gscan_event_internal_callback = nullptr;
809 on_gscan_full_result_internal_callback = nullptr;
810 }
811 return status;
812 }
813
getValidFrequenciesForBand(const std::string & iface_name,wifi_band band)814 std::pair<wifi_error, std::vector<uint32_t>> WifiLegacyHal::getValidFrequenciesForBand(
815 const std::string& iface_name, wifi_band band) {
816 static_assert(sizeof(uint32_t) >= sizeof(wifi_channel),
817 "Wifi Channel cannot be represented in output");
818 std::vector<uint32_t> freqs;
819 freqs.resize(kMaxGscanFrequenciesForBand);
820 int32_t num_freqs = 0;
821 wifi_error status = global_func_table_.wifi_get_valid_channels(
822 getIfaceHandle(iface_name), band, freqs.size(),
823 reinterpret_cast<wifi_channel*>(freqs.data()), &num_freqs);
824 CHECK(num_freqs >= 0 && static_cast<uint32_t>(num_freqs) <= kMaxGscanFrequenciesForBand);
825 freqs.resize(num_freqs);
826 return {status, std::move(freqs)};
827 }
828
setDfsFlag(const std::string & iface_name,bool dfs_on)829 wifi_error WifiLegacyHal::setDfsFlag(const std::string& iface_name, bool dfs_on) {
830 return global_func_table_.wifi_set_nodfs_flag(getIfaceHandle(iface_name), dfs_on ? 0 : 1);
831 }
832
enableLinkLayerStats(const std::string & iface_name,bool debug)833 wifi_error WifiLegacyHal::enableLinkLayerStats(const std::string& iface_name, bool debug) {
834 wifi_link_layer_params params;
835 params.mpdu_size_threshold = kLinkLayerStatsDataMpduSizeThreshold;
836 params.aggressive_statistics_gathering = debug;
837 return global_func_table_.wifi_set_link_stats(getIfaceHandle(iface_name), params);
838 }
839
disableLinkLayerStats(const std::string & iface_name)840 wifi_error WifiLegacyHal::disableLinkLayerStats(const std::string& iface_name) {
841 // TODO: Do we care about these responses?
842 uint32_t clear_mask_rsp;
843 uint8_t stop_rsp;
844 return global_func_table_.wifi_clear_link_stats(getIfaceHandle(iface_name), 0xFFFFFFFF,
845 &clear_mask_rsp, 1, &stop_rsp);
846 }
847
848 // Copies wifi_peer_info* to vector<WifiPeerInfo> and returns poiner to next element.
copyPeerInfo(wifi_peer_info * peer_ptr,std::vector<WifiPeerInfo> & peers)849 wifi_peer_info* WifiLegacyHal::copyPeerInfo(wifi_peer_info* peer_ptr,
850 std::vector<WifiPeerInfo>& peers) {
851 WifiPeerInfo peer;
852 peer.peer_info = *peer_ptr;
853 if (peer_ptr->num_rate > 0) {
854 // Copy the rate stats.
855 peer.rate_stats.assign(peer_ptr->rate_stats, peer_ptr->rate_stats + peer_ptr->num_rate);
856 }
857 peer.peer_info.num_rate = 0;
858 // Push peer info.
859 peers.push_back(peer);
860 // Return the address of next peer info.
861 return (wifi_peer_info*)((u8*)peer_ptr + sizeof(wifi_peer_info) +
862 (sizeof(wifi_rate_stat) * peer_ptr->num_rate));
863 }
864 // Copies wifi_link_stat* to vector<LinkStats> and returns poiner to next element.
copyLinkStat(wifi_link_stat * stat_ptr,std::vector<LinkStats> & stats)865 wifi_link_stat* WifiLegacyHal::copyLinkStat(wifi_link_stat* stat_ptr,
866 std::vector<LinkStats>& stats) {
867 LinkStats linkStat;
868 linkStat.stat = *stat_ptr;
869 wifi_peer_info* l_peer_info_stats_ptr = stat_ptr->peer_info;
870 for (uint32_t i = 0; i < linkStat.stat.num_peers; i++) {
871 l_peer_info_stats_ptr = copyPeerInfo(l_peer_info_stats_ptr, linkStat.peers);
872 }
873 // Copied all peers to linkStat.peers.
874 linkStat.stat.num_peers = 0;
875 // Push link stat.
876 stats.push_back(linkStat);
877 // Read all peers, return the address of next wifi_link_stat.
878 return (wifi_link_stat*)l_peer_info_stats_ptr;
879 }
880
getLinkLayerStats(const std::string & iface_name,LinkLayerStats & link_stats,LinkLayerMlStats & link_ml_stats)881 wifi_error WifiLegacyHal::getLinkLayerStats(const std::string& iface_name,
882 LinkLayerStats& link_stats,
883 LinkLayerMlStats& link_ml_stats) {
884 LinkLayerStats* link_stats_ptr = &link_stats;
885 link_stats_ptr->valid = false;
886
887 on_link_layer_stats_result_internal_callback = [&link_stats_ptr](
888 wifi_request_id /* id */,
889 wifi_iface_stat* iface_stats_ptr,
890 int num_radios,
891 wifi_radio_stat* radio_stats_ptr) {
892 wifi_radio_stat* l_radio_stats_ptr;
893 wifi_peer_info* l_peer_info_stats_ptr;
894 link_stats_ptr->valid = true;
895
896 if (iface_stats_ptr != nullptr) {
897 link_stats_ptr->iface = *iface_stats_ptr;
898 l_peer_info_stats_ptr = iface_stats_ptr->peer_info;
899 for (uint32_t i = 0; i < iface_stats_ptr->num_peers; i++) {
900 WifiPeerInfo peer;
901 peer.peer_info = *l_peer_info_stats_ptr;
902 if (l_peer_info_stats_ptr->num_rate > 0) {
903 /* Copy the rate stats */
904 peer.rate_stats.assign(
905 l_peer_info_stats_ptr->rate_stats,
906 l_peer_info_stats_ptr->rate_stats + l_peer_info_stats_ptr->num_rate);
907 }
908 peer.peer_info.num_rate = 0;
909 link_stats_ptr->peers.push_back(peer);
910 l_peer_info_stats_ptr =
911 (wifi_peer_info*)((u8*)l_peer_info_stats_ptr + sizeof(wifi_peer_info) +
912 (sizeof(wifi_rate_stat) *
913 l_peer_info_stats_ptr->num_rate));
914 }
915 link_stats_ptr->iface.num_peers = 0;
916 } else {
917 LOG(ERROR) << "Invalid iface stats in link layer stats";
918 }
919 if (num_radios <= 0 || radio_stats_ptr == nullptr) {
920 LOG(ERROR) << "Invalid radio stats in link layer stats";
921 return;
922 }
923 l_radio_stats_ptr = radio_stats_ptr;
924 for (int i = 0; i < num_radios; i++) {
925 LinkLayerRadioStats radio;
926
927 radio.stats = *l_radio_stats_ptr;
928 // Copy over the tx level array to the separate vector.
929 if (l_radio_stats_ptr->num_tx_levels > 0 &&
930 l_radio_stats_ptr->tx_time_per_levels != nullptr) {
931 radio.tx_time_per_levels.assign(
932 l_radio_stats_ptr->tx_time_per_levels,
933 l_radio_stats_ptr->tx_time_per_levels + l_radio_stats_ptr->num_tx_levels);
934 }
935 radio.stats.num_tx_levels = 0;
936 radio.stats.tx_time_per_levels = nullptr;
937 /* Copy over the channel stat to separate vector */
938 if (l_radio_stats_ptr->num_channels > 0) {
939 /* Copy the channel stats */
940 radio.channel_stats.assign(
941 l_radio_stats_ptr->channels,
942 l_radio_stats_ptr->channels + l_radio_stats_ptr->num_channels);
943 }
944 link_stats_ptr->radios.push_back(radio);
945 l_radio_stats_ptr =
946 (wifi_radio_stat*)((u8*)l_radio_stats_ptr + sizeof(wifi_radio_stat) +
947 (sizeof(wifi_channel_stat) *
948 l_radio_stats_ptr->num_channels));
949 }
950 };
951
952 LinkLayerMlStats* link_ml_stats_ptr = &link_ml_stats;
953 link_ml_stats_ptr->valid = false;
954
955 on_link_layer_ml_stats_result_internal_callback =
956 [this, &link_ml_stats_ptr](wifi_request_id /* id */,
957 wifi_iface_ml_stat* iface_ml_stats_ptr, int num_radios,
958 wifi_radio_stat* radio_stats_ptr) {
959 wifi_radio_stat* l_radio_stats_ptr;
960 wifi_link_stat* l_link_stat_ptr;
961 link_ml_stats_ptr->valid = true;
962
963 if (iface_ml_stats_ptr != nullptr && iface_ml_stats_ptr->num_links > 0) {
964 // Copy stats from wifi_iface_ml_stat to LinkLayerMlStats,
965 // - num_links * links[] to vector of links.
966 // - num_peers * peer_info[] to vector of links[i].peers.
967 link_ml_stats_ptr->iface = *iface_ml_stats_ptr;
968 l_link_stat_ptr = iface_ml_stats_ptr->links;
969 for (int l = 0; l < iface_ml_stats_ptr->num_links; ++l) {
970 l_link_stat_ptr = copyLinkStat(l_link_stat_ptr, link_ml_stats_ptr->links);
971 }
972 } else {
973 LOG(ERROR) << "Invalid iface stats in link layer stats";
974 }
975 if (num_radios <= 0 || radio_stats_ptr == nullptr) {
976 LOG(ERROR) << "Invalid radio stats in link layer stats";
977 return;
978 }
979 l_radio_stats_ptr = radio_stats_ptr;
980 for (int i = 0; i < num_radios; i++) {
981 LinkLayerRadioStats radio;
982
983 radio.stats = *l_radio_stats_ptr;
984 // Copy over the tx level array to the separate vector.
985 if (l_radio_stats_ptr->num_tx_levels > 0 &&
986 l_radio_stats_ptr->tx_time_per_levels != nullptr) {
987 radio.tx_time_per_levels.assign(l_radio_stats_ptr->tx_time_per_levels,
988 l_radio_stats_ptr->tx_time_per_levels +
989 l_radio_stats_ptr->num_tx_levels);
990 }
991 radio.stats.num_tx_levels = 0;
992 radio.stats.tx_time_per_levels = nullptr;
993 /* Copy over the channel stat to separate vector */
994 if (l_radio_stats_ptr->num_channels > 0) {
995 /* Copy the channel stats */
996 radio.channel_stats.assign(
997 l_radio_stats_ptr->channels,
998 l_radio_stats_ptr->channels + l_radio_stats_ptr->num_channels);
999 }
1000 link_ml_stats_ptr->radios.push_back(radio);
1001 l_radio_stats_ptr =
1002 (wifi_radio_stat*)((u8*)l_radio_stats_ptr + sizeof(wifi_radio_stat) +
1003 (sizeof(wifi_channel_stat) *
1004 l_radio_stats_ptr->num_channels));
1005 }
1006 };
1007
1008 wifi_error status = global_func_table_.wifi_get_link_stats(
1009 0, getIfaceHandle(iface_name),
1010 {onSyncLinkLayerStatsResult, onSyncLinkLayerMlStatsResult});
1011 on_link_layer_stats_result_internal_callback = nullptr;
1012 on_link_layer_ml_stats_result_internal_callback = nullptr;
1013
1014 return status;
1015 }
1016
startRssiMonitoring(const std::string & iface_name,wifi_request_id id,int8_t max_rssi,int8_t min_rssi,const on_rssi_threshold_breached_callback & on_threshold_breached_user_callback)1017 wifi_error WifiLegacyHal::startRssiMonitoring(
1018 const std::string& iface_name, wifi_request_id id, int8_t max_rssi, int8_t min_rssi,
1019 const on_rssi_threshold_breached_callback& on_threshold_breached_user_callback) {
1020 if (on_rssi_threshold_breached_internal_callback) {
1021 return WIFI_ERROR_NOT_AVAILABLE;
1022 }
1023 on_rssi_threshold_breached_internal_callback = [on_threshold_breached_user_callback](
1024 wifi_request_id id, uint8_t* bssid_ptr,
1025 int8_t rssi) {
1026 if (!bssid_ptr) {
1027 return;
1028 }
1029 std::array<uint8_t, ETH_ALEN> bssid_arr;
1030 // |bssid_ptr| pointer is assumed to have 6 bytes for the mac
1031 // address.
1032 std::copy(bssid_ptr, bssid_ptr + 6, std::begin(bssid_arr));
1033 on_threshold_breached_user_callback(id, bssid_arr, rssi);
1034 };
1035 wifi_error status = global_func_table_.wifi_start_rssi_monitoring(
1036 id, getIfaceHandle(iface_name), max_rssi, min_rssi, {onAsyncRssiThresholdBreached});
1037 if (status != WIFI_SUCCESS) {
1038 on_rssi_threshold_breached_internal_callback = nullptr;
1039 }
1040 return status;
1041 }
1042
stopRssiMonitoring(const std::string & iface_name,wifi_request_id id)1043 wifi_error WifiLegacyHal::stopRssiMonitoring(const std::string& iface_name, wifi_request_id id) {
1044 if (!on_rssi_threshold_breached_internal_callback) {
1045 return WIFI_ERROR_NOT_AVAILABLE;
1046 }
1047 wifi_error status =
1048 global_func_table_.wifi_stop_rssi_monitoring(id, getIfaceHandle(iface_name));
1049 // If the request Id is wrong, don't stop the ongoing rssi monitoring. Any
1050 // other error should be treated as the end of background scan.
1051 if (status != WIFI_ERROR_INVALID_REQUEST_ID) {
1052 on_rssi_threshold_breached_internal_callback = nullptr;
1053 }
1054 return status;
1055 }
1056
getRoamingCapabilities(const std::string & iface_name)1057 std::pair<wifi_error, wifi_roaming_capabilities> WifiLegacyHal::getRoamingCapabilities(
1058 const std::string& iface_name) {
1059 wifi_roaming_capabilities caps;
1060 wifi_error status =
1061 global_func_table_.wifi_get_roaming_capabilities(getIfaceHandle(iface_name), &caps);
1062 return {status, caps};
1063 }
1064
configureRoaming(const std::string & iface_name,const wifi_roaming_config & config)1065 wifi_error WifiLegacyHal::configureRoaming(const std::string& iface_name,
1066 const wifi_roaming_config& config) {
1067 wifi_roaming_config config_internal = config;
1068 return global_func_table_.wifi_configure_roaming(getIfaceHandle(iface_name), &config_internal);
1069 }
1070
enableFirmwareRoaming(const std::string & iface_name,fw_roaming_state_t state)1071 wifi_error WifiLegacyHal::enableFirmwareRoaming(const std::string& iface_name,
1072 fw_roaming_state_t state) {
1073 return global_func_table_.wifi_enable_firmware_roaming(getIfaceHandle(iface_name), state);
1074 }
1075
configureNdOffload(const std::string & iface_name,bool enable)1076 wifi_error WifiLegacyHal::configureNdOffload(const std::string& iface_name, bool enable) {
1077 return global_func_table_.wifi_configure_nd_offload(getIfaceHandle(iface_name), enable);
1078 }
1079
startSendingOffloadedPacket(const std::string & iface_name,int32_t cmd_id,uint16_t ether_type,const std::vector<uint8_t> & ip_packet_data,const std::array<uint8_t,6> & src_address,const std::array<uint8_t,6> & dst_address,int32_t period_in_ms)1080 wifi_error WifiLegacyHal::startSendingOffloadedPacket(const std::string& iface_name, int32_t cmd_id,
1081 uint16_t ether_type,
1082 const std::vector<uint8_t>& ip_packet_data,
1083 const std::array<uint8_t, 6>& src_address,
1084 const std::array<uint8_t, 6>& dst_address,
1085 int32_t period_in_ms) {
1086 std::vector<uint8_t> ip_packet_data_internal(ip_packet_data);
1087 std::vector<uint8_t> src_address_internal(src_address.data(),
1088 src_address.data() + src_address.size());
1089 std::vector<uint8_t> dst_address_internal(dst_address.data(),
1090 dst_address.data() + dst_address.size());
1091 return global_func_table_.wifi_start_sending_offloaded_packet(
1092 cmd_id, getIfaceHandle(iface_name), ether_type, ip_packet_data_internal.data(),
1093 ip_packet_data_internal.size(), src_address_internal.data(),
1094 dst_address_internal.data(), period_in_ms);
1095 }
1096
stopSendingOffloadedPacket(const std::string & iface_name,uint32_t cmd_id)1097 wifi_error WifiLegacyHal::stopSendingOffloadedPacket(const std::string& iface_name,
1098 uint32_t cmd_id) {
1099 return global_func_table_.wifi_stop_sending_offloaded_packet(cmd_id,
1100 getIfaceHandle(iface_name));
1101 }
1102
selectTxPowerScenario(const std::string & iface_name,wifi_power_scenario scenario)1103 wifi_error WifiLegacyHal::selectTxPowerScenario(const std::string& iface_name,
1104 wifi_power_scenario scenario) {
1105 return global_func_table_.wifi_select_tx_power_scenario(getIfaceHandle(iface_name), scenario);
1106 }
1107
resetTxPowerScenario(const std::string & iface_name)1108 wifi_error WifiLegacyHal::resetTxPowerScenario(const std::string& iface_name) {
1109 return global_func_table_.wifi_reset_tx_power_scenario(getIfaceHandle(iface_name));
1110 }
1111
setLatencyMode(const std::string & iface_name,wifi_latency_mode mode)1112 wifi_error WifiLegacyHal::setLatencyMode(const std::string& iface_name, wifi_latency_mode mode) {
1113 return global_func_table_.wifi_set_latency_mode(getIfaceHandle(iface_name), mode);
1114 }
1115
setThermalMitigationMode(wifi_thermal_mode mode,uint32_t completion_window)1116 wifi_error WifiLegacyHal::setThermalMitigationMode(wifi_thermal_mode mode,
1117 uint32_t completion_window) {
1118 return global_func_table_.wifi_set_thermal_mitigation_mode(global_handle_, mode,
1119 completion_window);
1120 }
1121
setDscpToAccessCategoryMapping(uint32_t start,uint32_t end,uint32_t access_category)1122 wifi_error WifiLegacyHal::setDscpToAccessCategoryMapping(uint32_t start, uint32_t end,
1123 uint32_t access_category) {
1124 return global_func_table_.wifi_map_dscp_access_category(global_handle_, start, end,
1125 access_category);
1126 }
1127
resetDscpToAccessCategoryMapping()1128 wifi_error WifiLegacyHal::resetDscpToAccessCategoryMapping() {
1129 return global_func_table_.wifi_reset_dscp_mapping(global_handle_);
1130 }
1131
getLoggerSupportedFeatureSet(const std::string & iface_name)1132 std::pair<wifi_error, uint32_t> WifiLegacyHal::getLoggerSupportedFeatureSet(
1133 const std::string& iface_name) {
1134 uint32_t supported_feature_flags = 0;
1135 wifi_error status = WIFI_SUCCESS;
1136
1137 wifi_interface_handle iface_handle = getIfaceHandle(iface_name);
1138
1139 if (iface_handle) {
1140 status = global_func_table_.wifi_get_logger_supported_feature_set(iface_handle,
1141 &supported_feature_flags);
1142 }
1143 return {status, supported_feature_flags};
1144 }
1145
startPktFateMonitoring(const std::string & iface_name)1146 wifi_error WifiLegacyHal::startPktFateMonitoring(const std::string& iface_name) {
1147 return global_func_table_.wifi_start_pkt_fate_monitoring(getIfaceHandle(iface_name));
1148 }
1149
getTxPktFates(const std::string & iface_name)1150 std::pair<wifi_error, std::vector<wifi_tx_report>> WifiLegacyHal::getTxPktFates(
1151 const std::string& iface_name) {
1152 std::vector<wifi_tx_report> tx_pkt_fates;
1153 tx_pkt_fates.resize(MAX_FATE_LOG_LEN);
1154 size_t num_fates = 0;
1155 wifi_error status = global_func_table_.wifi_get_tx_pkt_fates(
1156 getIfaceHandle(iface_name), tx_pkt_fates.data(), tx_pkt_fates.size(), &num_fates);
1157 CHECK(num_fates <= MAX_FATE_LOG_LEN);
1158 tx_pkt_fates.resize(num_fates);
1159 return {status, std::move(tx_pkt_fates)};
1160 }
1161
getRxPktFates(const std::string & iface_name)1162 std::pair<wifi_error, std::vector<wifi_rx_report>> WifiLegacyHal::getRxPktFates(
1163 const std::string& iface_name) {
1164 std::vector<wifi_rx_report> rx_pkt_fates;
1165 rx_pkt_fates.resize(MAX_FATE_LOG_LEN);
1166 size_t num_fates = 0;
1167 wifi_error status = global_func_table_.wifi_get_rx_pkt_fates(
1168 getIfaceHandle(iface_name), rx_pkt_fates.data(), rx_pkt_fates.size(), &num_fates);
1169 CHECK(num_fates <= MAX_FATE_LOG_LEN);
1170 rx_pkt_fates.resize(num_fates);
1171 return {status, std::move(rx_pkt_fates)};
1172 }
1173
getWakeReasonStats(const std::string & iface_name)1174 std::pair<wifi_error, WakeReasonStats> WifiLegacyHal::getWakeReasonStats(
1175 const std::string& iface_name) {
1176 WakeReasonStats stats;
1177 stats.cmd_event_wake_cnt.resize(kMaxWakeReasonStatsArraySize);
1178 stats.driver_fw_local_wake_cnt.resize(kMaxWakeReasonStatsArraySize);
1179
1180 // This legacy struct needs separate memory to store the variable sized wake
1181 // reason types.
1182 stats.wake_reason_cnt.cmd_event_wake_cnt =
1183 reinterpret_cast<int32_t*>(stats.cmd_event_wake_cnt.data());
1184 stats.wake_reason_cnt.cmd_event_wake_cnt_sz = stats.cmd_event_wake_cnt.size();
1185 stats.wake_reason_cnt.cmd_event_wake_cnt_used = 0;
1186 stats.wake_reason_cnt.driver_fw_local_wake_cnt =
1187 reinterpret_cast<int32_t*>(stats.driver_fw_local_wake_cnt.data());
1188 stats.wake_reason_cnt.driver_fw_local_wake_cnt_sz = stats.driver_fw_local_wake_cnt.size();
1189 stats.wake_reason_cnt.driver_fw_local_wake_cnt_used = 0;
1190
1191 wifi_error status = global_func_table_.wifi_get_wake_reason_stats(getIfaceHandle(iface_name),
1192 &stats.wake_reason_cnt);
1193
1194 CHECK(stats.wake_reason_cnt.cmd_event_wake_cnt_used >= 0 &&
1195 static_cast<uint32_t>(stats.wake_reason_cnt.cmd_event_wake_cnt_used) <=
1196 kMaxWakeReasonStatsArraySize);
1197 stats.cmd_event_wake_cnt.resize(stats.wake_reason_cnt.cmd_event_wake_cnt_used);
1198 stats.wake_reason_cnt.cmd_event_wake_cnt = nullptr;
1199
1200 CHECK(stats.wake_reason_cnt.driver_fw_local_wake_cnt_used >= 0 &&
1201 static_cast<uint32_t>(stats.wake_reason_cnt.driver_fw_local_wake_cnt_used) <=
1202 kMaxWakeReasonStatsArraySize);
1203 stats.driver_fw_local_wake_cnt.resize(stats.wake_reason_cnt.driver_fw_local_wake_cnt_used);
1204 stats.wake_reason_cnt.driver_fw_local_wake_cnt = nullptr;
1205
1206 return {status, stats};
1207 }
1208
registerRingBufferCallbackHandler(const std::string & iface_name,const on_ring_buffer_data_callback & on_user_data_callback)1209 wifi_error WifiLegacyHal::registerRingBufferCallbackHandler(
1210 const std::string& iface_name, const on_ring_buffer_data_callback& on_user_data_callback) {
1211 if (on_ring_buffer_data_internal_callback) {
1212 return WIFI_ERROR_NOT_AVAILABLE;
1213 }
1214 on_ring_buffer_data_internal_callback = [on_user_data_callback](
1215 char* ring_name, char* buffer, int buffer_size,
1216 wifi_ring_buffer_status* status) {
1217 if (status && buffer) {
1218 std::vector<uint8_t> buffer_vector(reinterpret_cast<uint8_t*>(buffer),
1219 reinterpret_cast<uint8_t*>(buffer) + buffer_size);
1220 on_user_data_callback(ring_name, buffer_vector, *status);
1221 }
1222 };
1223 wifi_error status = global_func_table_.wifi_set_log_handler(0, getIfaceHandle(iface_name),
1224 {onAsyncRingBufferData});
1225 if (status != WIFI_SUCCESS) {
1226 on_ring_buffer_data_internal_callback = nullptr;
1227 }
1228 return status;
1229 }
1230
deregisterRingBufferCallbackHandler(const std::string & iface_name)1231 wifi_error WifiLegacyHal::deregisterRingBufferCallbackHandler(const std::string& iface_name) {
1232 if (!on_ring_buffer_data_internal_callback) {
1233 return WIFI_ERROR_NOT_AVAILABLE;
1234 }
1235 on_ring_buffer_data_internal_callback = nullptr;
1236 return global_func_table_.wifi_reset_log_handler(0, getIfaceHandle(iface_name));
1237 }
1238
getRingBuffersStatus(const std::string & iface_name)1239 std::pair<wifi_error, std::vector<wifi_ring_buffer_status>> WifiLegacyHal::getRingBuffersStatus(
1240 const std::string& iface_name) {
1241 std::vector<wifi_ring_buffer_status> ring_buffers_status;
1242 ring_buffers_status.resize(kMaxRingBuffers);
1243 uint32_t num_rings = kMaxRingBuffers;
1244 wifi_error status = global_func_table_.wifi_get_ring_buffers_status(
1245 getIfaceHandle(iface_name), &num_rings, ring_buffers_status.data());
1246 CHECK(num_rings <= kMaxRingBuffers);
1247 ring_buffers_status.resize(num_rings);
1248 return {status, std::move(ring_buffers_status)};
1249 }
1250
startRingBufferLogging(const std::string & iface_name,const std::string & ring_name,uint32_t verbose_level,uint32_t max_interval_sec,uint32_t min_data_size)1251 wifi_error WifiLegacyHal::startRingBufferLogging(const std::string& iface_name,
1252 const std::string& ring_name,
1253 uint32_t verbose_level, uint32_t max_interval_sec,
1254 uint32_t min_data_size) {
1255 return global_func_table_.wifi_start_logging(getIfaceHandle(iface_name), verbose_level, 0,
1256 max_interval_sec, min_data_size,
1257 makeCharVec(ring_name).data());
1258 }
1259
getRingBufferData(const std::string & iface_name,const std::string & ring_name)1260 wifi_error WifiLegacyHal::getRingBufferData(const std::string& iface_name,
1261 const std::string& ring_name) {
1262 return global_func_table_.wifi_get_ring_data(getIfaceHandle(iface_name),
1263 makeCharVec(ring_name).data());
1264 }
1265
registerErrorAlertCallbackHandler(const std::string & iface_name,const on_error_alert_callback & on_user_alert_callback)1266 wifi_error WifiLegacyHal::registerErrorAlertCallbackHandler(
1267 const std::string& iface_name, const on_error_alert_callback& on_user_alert_callback) {
1268 if (on_error_alert_internal_callback) {
1269 return WIFI_ERROR_NOT_AVAILABLE;
1270 }
1271 on_error_alert_internal_callback = [on_user_alert_callback](wifi_request_id id, char* buffer,
1272 int buffer_size, int err_code) {
1273 if (buffer) {
1274 CHECK(id == 0);
1275 on_user_alert_callback(
1276 err_code,
1277 std::vector<uint8_t>(reinterpret_cast<uint8_t*>(buffer),
1278 reinterpret_cast<uint8_t*>(buffer) + buffer_size));
1279 }
1280 };
1281 wifi_error status = global_func_table_.wifi_set_alert_handler(0, getIfaceHandle(iface_name),
1282 {onAsyncErrorAlert});
1283 if (status != WIFI_SUCCESS) {
1284 on_error_alert_internal_callback = nullptr;
1285 }
1286 return status;
1287 }
1288
deregisterErrorAlertCallbackHandler(const std::string & iface_name)1289 wifi_error WifiLegacyHal::deregisterErrorAlertCallbackHandler(const std::string& iface_name) {
1290 if (!on_error_alert_internal_callback) {
1291 return WIFI_ERROR_NOT_AVAILABLE;
1292 }
1293 on_error_alert_internal_callback = nullptr;
1294 return global_func_table_.wifi_reset_alert_handler(0, getIfaceHandle(iface_name));
1295 }
1296
registerRadioModeChangeCallbackHandler(const std::string & iface_name,const on_radio_mode_change_callback & on_user_change_callback)1297 wifi_error WifiLegacyHal::registerRadioModeChangeCallbackHandler(
1298 const std::string& iface_name,
1299 const on_radio_mode_change_callback& on_user_change_callback) {
1300 if (on_radio_mode_change_internal_callback) {
1301 return WIFI_ERROR_NOT_AVAILABLE;
1302 }
1303 on_radio_mode_change_internal_callback = [on_user_change_callback](
1304 wifi_request_id /* id */, uint32_t num_macs,
1305 wifi_mac_info* mac_infos_arr) {
1306 if (num_macs > 0 && mac_infos_arr) {
1307 std::vector<WifiMacInfo> mac_infos_vec;
1308 for (uint32_t i = 0; i < num_macs; i++) {
1309 WifiMacInfo mac_info;
1310 mac_info.wlan_mac_id = mac_infos_arr[i].wlan_mac_id;
1311 mac_info.mac_band = mac_infos_arr[i].mac_band;
1312 for (int32_t j = 0; j < mac_infos_arr[i].num_iface; j++) {
1313 WifiIfaceInfo iface_info;
1314 iface_info.name = mac_infos_arr[i].iface_info[j].iface_name;
1315 iface_info.channel = mac_infos_arr[i].iface_info[j].channel;
1316 mac_info.iface_infos.push_back(iface_info);
1317 }
1318 mac_infos_vec.push_back(mac_info);
1319 }
1320 on_user_change_callback(mac_infos_vec);
1321 }
1322 };
1323 wifi_error status = global_func_table_.wifi_set_radio_mode_change_handler(
1324 0, getIfaceHandle(iface_name), {onAsyncRadioModeChange});
1325 if (status != WIFI_SUCCESS) {
1326 on_radio_mode_change_internal_callback = nullptr;
1327 }
1328 return status;
1329 }
1330
registerSubsystemRestartCallbackHandler(const on_subsystem_restart_callback & on_restart_callback)1331 wifi_error WifiLegacyHal::registerSubsystemRestartCallbackHandler(
1332 const on_subsystem_restart_callback& on_restart_callback) {
1333 if (on_subsystem_restart_internal_callback) {
1334 return WIFI_ERROR_NOT_AVAILABLE;
1335 }
1336 on_subsystem_restart_internal_callback = [on_restart_callback](const char* error) {
1337 on_restart_callback(error);
1338 };
1339 wifi_error status = global_func_table_.wifi_set_subsystem_restart_handler(
1340 global_handle_, {onAsyncSubsystemRestart});
1341 if (status != WIFI_SUCCESS) {
1342 on_subsystem_restart_internal_callback = nullptr;
1343 }
1344 return status;
1345 }
1346
startRttRangeRequestV3(const std::string & iface_name,wifi_request_id id,const std::vector<wifi_rtt_config_v3> & rtt_configs,const on_rtt_results_callback_v3 & on_results_user_callback_v3)1347 wifi_error WifiLegacyHal::startRttRangeRequestV3(
1348 const std::string& iface_name, wifi_request_id id,
1349 const std::vector<wifi_rtt_config_v3>& rtt_configs,
1350 const on_rtt_results_callback_v3& on_results_user_callback_v3) {
1351 if (on_rtt_results_internal_callback_v3) {
1352 return WIFI_ERROR_NOT_AVAILABLE;
1353 }
1354
1355 on_rtt_results_internal_callback_v3 = [on_results_user_callback_v3](
1356 wifi_request_id id, unsigned num_results,
1357 wifi_rtt_result_v3* rtt_results_v3[]) {
1358 if (num_results > 0 && !rtt_results_v3) {
1359 LOG(ERROR) << "Unexpected nullptr in RTT v3 results";
1360 return;
1361 }
1362 std::vector<const wifi_rtt_result_v3*> rtt_results_vec_v3;
1363 std::copy_if(rtt_results_v3, rtt_results_v3 + num_results,
1364 back_inserter(rtt_results_vec_v3),
1365 [](wifi_rtt_result_v3* rtt_result_v3) { return rtt_result_v3 != nullptr; });
1366 on_results_user_callback_v3(id, rtt_results_vec_v3);
1367 };
1368
1369 std::vector<wifi_rtt_config_v3> rtt_configs_internal(rtt_configs);
1370 wifi_error status = global_func_table_.wifi_rtt_range_request_v3(
1371 id, getIfaceHandle(iface_name), rtt_configs.size(), rtt_configs_internal.data(),
1372 {onAsyncRttResultsV3});
1373 if (status != WIFI_SUCCESS) {
1374 invalidateRttResultsCallbacks();
1375 }
1376 return status;
1377 }
1378
startRttRangeRequest(const std::string & iface_name,wifi_request_id id,const std::vector<wifi_rtt_config> & rtt_configs,const on_rtt_results_callback & on_results_user_callback,const on_rtt_results_callback_v2 & on_results_user_callback_v2)1379 wifi_error WifiLegacyHal::startRttRangeRequest(
1380 const std::string& iface_name, wifi_request_id id,
1381 const std::vector<wifi_rtt_config>& rtt_configs,
1382 const on_rtt_results_callback& on_results_user_callback,
1383 const on_rtt_results_callback_v2& on_results_user_callback_v2) {
1384 if (on_rtt_results_internal_callback || on_rtt_results_internal_callback_v2) {
1385 return WIFI_ERROR_NOT_AVAILABLE;
1386 }
1387
1388 on_rtt_results_internal_callback = [on_results_user_callback](wifi_request_id id,
1389 unsigned num_results,
1390 wifi_rtt_result* rtt_results[]) {
1391 if (num_results > 0 && !rtt_results) {
1392 LOG(ERROR) << "Unexpected nullptr in RTT results";
1393 return;
1394 }
1395 std::vector<const wifi_rtt_result*> rtt_results_vec;
1396 std::copy_if(rtt_results, rtt_results + num_results, back_inserter(rtt_results_vec),
1397 [](wifi_rtt_result* rtt_result) { return rtt_result != nullptr; });
1398 on_results_user_callback(id, rtt_results_vec);
1399 };
1400
1401 on_rtt_results_internal_callback_v2 = [on_results_user_callback_v2](
1402 wifi_request_id id, unsigned num_results,
1403 wifi_rtt_result_v2* rtt_results_v2[]) {
1404 if (num_results > 0 && !rtt_results_v2) {
1405 LOG(ERROR) << "Unexpected nullptr in RTT results";
1406 return;
1407 }
1408 std::vector<const wifi_rtt_result_v2*> rtt_results_vec_v2;
1409 std::copy_if(rtt_results_v2, rtt_results_v2 + num_results,
1410 back_inserter(rtt_results_vec_v2),
1411 [](wifi_rtt_result_v2* rtt_result_v2) { return rtt_result_v2 != nullptr; });
1412 on_results_user_callback_v2(id, rtt_results_vec_v2);
1413 };
1414
1415 std::vector<wifi_rtt_config> rtt_configs_internal(rtt_configs);
1416 wifi_error status = global_func_table_.wifi_rtt_range_request(
1417 id, getIfaceHandle(iface_name), rtt_configs.size(), rtt_configs_internal.data(),
1418 {onAsyncRttResults, onAsyncRttResultsV2});
1419 if (status != WIFI_SUCCESS) {
1420 invalidateRttResultsCallbacks();
1421 }
1422 return status;
1423 }
1424
cancelRttRangeRequest(const std::string & iface_name,wifi_request_id id,const std::vector<std::array<uint8_t,ETH_ALEN>> & mac_addrs)1425 wifi_error WifiLegacyHal::cancelRttRangeRequest(
1426 const std::string& iface_name, wifi_request_id id,
1427 const std::vector<std::array<uint8_t, ETH_ALEN>>& mac_addrs) {
1428 if (!on_rtt_results_internal_callback && !on_rtt_results_internal_callback_v2) {
1429 return WIFI_ERROR_NOT_AVAILABLE;
1430 }
1431 static_assert(sizeof(mac_addr) == sizeof(std::array<uint8_t, ETH_ALEN>),
1432 "MAC address size mismatch");
1433 // TODO: How do we handle partial cancels (i.e only a subset of enabled mac
1434 // addressed are cancelled).
1435 std::vector<std::array<uint8_t, ETH_ALEN>> mac_addrs_internal(mac_addrs);
1436 wifi_error status = global_func_table_.wifi_rtt_range_cancel(
1437 id, getIfaceHandle(iface_name), mac_addrs.size(),
1438 reinterpret_cast<mac_addr*>(mac_addrs_internal.data()));
1439 // If the request Id is wrong, don't stop the ongoing range request. Any
1440 // other error should be treated as the end of rtt ranging.
1441 if (status != WIFI_ERROR_INVALID_REQUEST_ID) {
1442 invalidateRttResultsCallbacks();
1443 }
1444 return status;
1445 }
1446
getRttCapabilities(const std::string & iface_name)1447 std::pair<wifi_error, wifi_rtt_capabilities> WifiLegacyHal::getRttCapabilities(
1448 const std::string& iface_name) {
1449 wifi_rtt_capabilities rtt_caps;
1450 wifi_error status =
1451 global_func_table_.wifi_get_rtt_capabilities(getIfaceHandle(iface_name), &rtt_caps);
1452 return {status, rtt_caps};
1453 }
1454
getRttCapabilitiesV3(const std::string & iface_name)1455 std::pair<wifi_error, wifi_rtt_capabilities_v3> WifiLegacyHal::getRttCapabilitiesV3(
1456 const std::string& iface_name) {
1457 wifi_rtt_capabilities_v3 rtt_caps_v3;
1458 wifi_error status = global_func_table_.wifi_get_rtt_capabilities_v3(getIfaceHandle(iface_name),
1459 &rtt_caps_v3);
1460 return {status, rtt_caps_v3};
1461 }
1462
getRttResponderInfo(const std::string & iface_name)1463 std::pair<wifi_error, wifi_rtt_responder> WifiLegacyHal::getRttResponderInfo(
1464 const std::string& iface_name) {
1465 wifi_rtt_responder rtt_responder;
1466 wifi_error status = global_func_table_.wifi_rtt_get_responder_info(getIfaceHandle(iface_name),
1467 &rtt_responder);
1468 return {status, rtt_responder};
1469 }
1470
enableRttResponder(const std::string & iface_name,wifi_request_id id,const wifi_channel_info & channel_hint,uint32_t max_duration_secs,const wifi_rtt_responder & info)1471 wifi_error WifiLegacyHal::enableRttResponder(const std::string& iface_name, wifi_request_id id,
1472 const wifi_channel_info& channel_hint,
1473 uint32_t max_duration_secs,
1474 const wifi_rtt_responder& info) {
1475 wifi_rtt_responder info_internal(info);
1476 return global_func_table_.wifi_enable_responder(id, getIfaceHandle(iface_name), channel_hint,
1477 max_duration_secs, &info_internal);
1478 }
1479
disableRttResponder(const std::string & iface_name,wifi_request_id id)1480 wifi_error WifiLegacyHal::disableRttResponder(const std::string& iface_name, wifi_request_id id) {
1481 return global_func_table_.wifi_disable_responder(id, getIfaceHandle(iface_name));
1482 }
1483
setRttLci(const std::string & iface_name,wifi_request_id id,const wifi_lci_information & info)1484 wifi_error WifiLegacyHal::setRttLci(const std::string& iface_name, wifi_request_id id,
1485 const wifi_lci_information& info) {
1486 wifi_lci_information info_internal(info);
1487 return global_func_table_.wifi_set_lci(id, getIfaceHandle(iface_name), &info_internal);
1488 }
1489
setRttLcr(const std::string & iface_name,wifi_request_id id,const wifi_lcr_information & info)1490 wifi_error WifiLegacyHal::setRttLcr(const std::string& iface_name, wifi_request_id id,
1491 const wifi_lcr_information& info) {
1492 wifi_lcr_information info_internal(info);
1493 return global_func_table_.wifi_set_lcr(id, getIfaceHandle(iface_name), &info_internal);
1494 }
1495
nanRegisterCallbackHandlers(const std::string & iface_name,const NanCallbackHandlers & user_callbacks)1496 wifi_error WifiLegacyHal::nanRegisterCallbackHandlers(const std::string& iface_name,
1497 const NanCallbackHandlers& user_callbacks) {
1498 on_nan_notify_response_user_callback = user_callbacks.on_notify_response;
1499 on_nan_event_publish_terminated_user_callback = user_callbacks.on_event_publish_terminated;
1500 on_nan_event_match_user_callback = user_callbacks.on_event_match;
1501 on_nan_event_match_expired_user_callback = user_callbacks.on_event_match_expired;
1502 on_nan_event_subscribe_terminated_user_callback = user_callbacks.on_event_subscribe_terminated;
1503 on_nan_event_followup_user_callback = user_callbacks.on_event_followup;
1504 on_nan_event_disc_eng_event_user_callback = user_callbacks.on_event_disc_eng_event;
1505 on_nan_event_disabled_user_callback = user_callbacks.on_event_disabled;
1506 on_nan_event_tca_user_callback = user_callbacks.on_event_tca;
1507 on_nan_event_beacon_sdf_payload_user_callback = user_callbacks.on_event_beacon_sdf_payload;
1508 on_nan_event_data_path_request_user_callback = user_callbacks.on_event_data_path_request;
1509 on_nan_event_pairing_request_user_callback = user_callbacks.on_event_pairing_request;
1510 on_nan_event_pairing_confirm_user_callback = user_callbacks.on_event_pairing_confirm;
1511 on_nan_event_bootstrapping_request_user_callback =
1512 user_callbacks.on_event_bootstrapping_request;
1513 on_nan_event_bootstrapping_confirm_user_callback =
1514 user_callbacks.on_event_bootstrapping_confirm;
1515 on_nan_event_data_path_confirm_user_callback = user_callbacks.on_event_data_path_confirm;
1516 on_nan_event_data_path_end_user_callback = user_callbacks.on_event_data_path_end;
1517 on_nan_event_transmit_follow_up_user_callback = user_callbacks.on_event_transmit_follow_up;
1518 on_nan_event_range_request_user_callback = user_callbacks.on_event_range_request;
1519 on_nan_event_range_report_user_callback = user_callbacks.on_event_range_report;
1520 on_nan_event_schedule_update_user_callback = user_callbacks.on_event_schedule_update;
1521 on_nan_event_suspension_mode_change_user_callback =
1522 user_callbacks.on_event_suspension_mode_change;
1523 on_nan_event_ranging_results_callback = user_callbacks.on_ranging_results;
1524
1525 return global_func_table_.wifi_nan_register_handler(getIfaceHandle(iface_name),
1526 {onAsyncNanNotifyResponse,
1527 onAsyncNanEventPublishReplied,
1528 onAsyncNanEventPublishTerminated,
1529 onAsyncNanEventMatch,
1530 onAsyncNanEventMatchExpired,
1531 onAsyncNanEventSubscribeTerminated,
1532 onAsyncNanEventFollowup,
1533 onAsyncNanEventDiscEngEvent,
1534 onAsyncNanEventDisabled,
1535 onAsyncNanEventTca,
1536 onAsyncNanEventBeaconSdfPayload,
1537 onAsyncNanEventDataPathRequest,
1538 onAsyncNanEventDataPathConfirm,
1539 onAsyncNanEventDataPathEnd,
1540 onAsyncNanEventTransmitFollowUp,
1541 onAsyncNanEventRangeRequest,
1542 onAsyncNanEventRangeReport,
1543 onAsyncNanEventScheduleUpdate,
1544 onAsyncNanEventPairingRequest,
1545 onAsyncNanEventPairingConfirm,
1546 onAsyncNanEventBootstrappingRequest,
1547 onAsyncNanEventBootstrappingConfirm,
1548 onAsyncNanEventSuspensionModeChange,
1549 onAsyncNanEventRangingResults});
1550 }
1551
nanEnableRequest(const std::string & iface_name,transaction_id id,const NanEnableRequest & msg)1552 wifi_error WifiLegacyHal::nanEnableRequest(const std::string& iface_name, transaction_id id,
1553 const NanEnableRequest& msg) {
1554 NanEnableRequest msg_internal(msg);
1555 return global_func_table_.wifi_nan_enable_request(id, getIfaceHandle(iface_name),
1556 &msg_internal);
1557 }
1558
nanDisableRequest(const std::string & iface_name,transaction_id id)1559 wifi_error WifiLegacyHal::nanDisableRequest(const std::string& iface_name, transaction_id id) {
1560 return global_func_table_.wifi_nan_disable_request(id, getIfaceHandle(iface_name));
1561 }
1562
nanPublishRequest(const std::string & iface_name,transaction_id id,const NanPublishRequest & msg)1563 wifi_error WifiLegacyHal::nanPublishRequest(const std::string& iface_name, transaction_id id,
1564 const NanPublishRequest& msg) {
1565 NanPublishRequest msg_internal(msg);
1566 return global_func_table_.wifi_nan_publish_request(id, getIfaceHandle(iface_name),
1567 &msg_internal);
1568 }
1569
nanPublishCancelRequest(const std::string & iface_name,transaction_id id,const NanPublishCancelRequest & msg)1570 wifi_error WifiLegacyHal::nanPublishCancelRequest(const std::string& iface_name, transaction_id id,
1571 const NanPublishCancelRequest& msg) {
1572 NanPublishCancelRequest msg_internal(msg);
1573 return global_func_table_.wifi_nan_publish_cancel_request(id, getIfaceHandle(iface_name),
1574 &msg_internal);
1575 }
1576
nanSubscribeRequest(const std::string & iface_name,transaction_id id,const NanSubscribeRequest & msg)1577 wifi_error WifiLegacyHal::nanSubscribeRequest(const std::string& iface_name, transaction_id id,
1578 const NanSubscribeRequest& msg) {
1579 NanSubscribeRequest msg_internal(msg);
1580 return global_func_table_.wifi_nan_subscribe_request(id, getIfaceHandle(iface_name),
1581 &msg_internal);
1582 }
1583
nanSubscribeCancelRequest(const std::string & iface_name,transaction_id id,const NanSubscribeCancelRequest & msg)1584 wifi_error WifiLegacyHal::nanSubscribeCancelRequest(const std::string& iface_name,
1585 transaction_id id,
1586 const NanSubscribeCancelRequest& msg) {
1587 NanSubscribeCancelRequest msg_internal(msg);
1588 return global_func_table_.wifi_nan_subscribe_cancel_request(id, getIfaceHandle(iface_name),
1589 &msg_internal);
1590 }
1591
nanTransmitFollowupRequest(const std::string & iface_name,transaction_id id,const NanTransmitFollowupRequest & msg)1592 wifi_error WifiLegacyHal::nanTransmitFollowupRequest(const std::string& iface_name,
1593 transaction_id id,
1594 const NanTransmitFollowupRequest& msg) {
1595 NanTransmitFollowupRequest msg_internal(msg);
1596 return global_func_table_.wifi_nan_transmit_followup_request(id, getIfaceHandle(iface_name),
1597 &msg_internal);
1598 }
1599
nanStatsRequest(const std::string & iface_name,transaction_id id,const NanStatsRequest & msg)1600 wifi_error WifiLegacyHal::nanStatsRequest(const std::string& iface_name, transaction_id id,
1601 const NanStatsRequest& msg) {
1602 NanStatsRequest msg_internal(msg);
1603 return global_func_table_.wifi_nan_stats_request(id, getIfaceHandle(iface_name), &msg_internal);
1604 }
1605
nanConfigRequest(const std::string & iface_name,transaction_id id,const NanConfigRequest & msg)1606 wifi_error WifiLegacyHal::nanConfigRequest(const std::string& iface_name, transaction_id id,
1607 const NanConfigRequest& msg) {
1608 NanConfigRequest msg_internal(msg);
1609 return global_func_table_.wifi_nan_config_request(id, getIfaceHandle(iface_name),
1610 &msg_internal);
1611 }
1612
nanTcaRequest(const std::string & iface_name,transaction_id id,const NanTCARequest & msg)1613 wifi_error WifiLegacyHal::nanTcaRequest(const std::string& iface_name, transaction_id id,
1614 const NanTCARequest& msg) {
1615 NanTCARequest msg_internal(msg);
1616 return global_func_table_.wifi_nan_tca_request(id, getIfaceHandle(iface_name), &msg_internal);
1617 }
1618
nanBeaconSdfPayloadRequest(const std::string & iface_name,transaction_id id,const NanBeaconSdfPayloadRequest & msg)1619 wifi_error WifiLegacyHal::nanBeaconSdfPayloadRequest(const std::string& iface_name,
1620 transaction_id id,
1621 const NanBeaconSdfPayloadRequest& msg) {
1622 NanBeaconSdfPayloadRequest msg_internal(msg);
1623 return global_func_table_.wifi_nan_beacon_sdf_payload_request(id, getIfaceHandle(iface_name),
1624 &msg_internal);
1625 }
1626
nanGetVersion()1627 std::pair<wifi_error, NanVersion> WifiLegacyHal::nanGetVersion() {
1628 NanVersion version;
1629 wifi_error status = global_func_table_.wifi_nan_get_version(global_handle_, &version);
1630 return {status, version};
1631 }
1632
nanGetCapabilities(const std::string & iface_name,transaction_id id)1633 wifi_error WifiLegacyHal::nanGetCapabilities(const std::string& iface_name, transaction_id id) {
1634 return global_func_table_.wifi_nan_get_capabilities(id, getIfaceHandle(iface_name));
1635 }
1636
nanDataInterfaceCreate(const std::string & iface_name,transaction_id id,const std::string & data_iface_name)1637 wifi_error WifiLegacyHal::nanDataInterfaceCreate(const std::string& iface_name, transaction_id id,
1638 const std::string& data_iface_name) {
1639 return global_func_table_.wifi_nan_data_interface_create(id, getIfaceHandle(iface_name),
1640 makeCharVec(data_iface_name).data());
1641 }
1642
nanDataInterfaceDelete(const std::string & iface_name,transaction_id id,const std::string & data_iface_name)1643 wifi_error WifiLegacyHal::nanDataInterfaceDelete(const std::string& iface_name, transaction_id id,
1644 const std::string& data_iface_name) {
1645 return global_func_table_.wifi_nan_data_interface_delete(id, getIfaceHandle(iface_name),
1646 makeCharVec(data_iface_name).data());
1647 }
1648
nanDataRequestInitiator(const std::string & iface_name,transaction_id id,const NanDataPathInitiatorRequest & msg)1649 wifi_error WifiLegacyHal::nanDataRequestInitiator(const std::string& iface_name, transaction_id id,
1650 const NanDataPathInitiatorRequest& msg) {
1651 NanDataPathInitiatorRequest msg_internal(msg);
1652 return global_func_table_.wifi_nan_data_request_initiator(id, getIfaceHandle(iface_name),
1653 &msg_internal);
1654 }
1655
nanDataIndicationResponse(const std::string & iface_name,transaction_id id,const NanDataPathIndicationResponse & msg)1656 wifi_error WifiLegacyHal::nanDataIndicationResponse(const std::string& iface_name,
1657 transaction_id id,
1658 const NanDataPathIndicationResponse& msg) {
1659 NanDataPathIndicationResponse msg_internal(msg);
1660 return global_func_table_.wifi_nan_data_indication_response(id, getIfaceHandle(iface_name),
1661 &msg_internal);
1662 }
1663
nanPairingRequest(const std::string & iface_name,transaction_id id,const NanPairingRequest & msg)1664 wifi_error WifiLegacyHal::nanPairingRequest(const std::string& iface_name, transaction_id id,
1665 const NanPairingRequest& msg) {
1666 NanPairingRequest msg_internal(msg);
1667 return global_func_table_.wifi_nan_pairing_request(id, getIfaceHandle(iface_name),
1668 &msg_internal);
1669 }
1670
nanPairingIndicationResponse(const std::string & iface_name,transaction_id id,const NanPairingIndicationResponse & msg)1671 wifi_error WifiLegacyHal::nanPairingIndicationResponse(const std::string& iface_name,
1672 transaction_id id,
1673 const NanPairingIndicationResponse& msg) {
1674 NanPairingIndicationResponse msg_internal(msg);
1675 return global_func_table_.wifi_nan_pairing_indication_response(id, getIfaceHandle(iface_name),
1676 &msg_internal);
1677 }
1678
nanBootstrappingRequest(const std::string & iface_name,transaction_id id,const NanBootstrappingRequest & msg)1679 wifi_error WifiLegacyHal::nanBootstrappingRequest(const std::string& iface_name, transaction_id id,
1680 const NanBootstrappingRequest& msg) {
1681 NanBootstrappingRequest msg_internal(msg);
1682 return global_func_table_.wifi_nan_bootstrapping_request(id, getIfaceHandle(iface_name),
1683 &msg_internal);
1684 }
1685
nanBootstrappingIndicationResponse(const std::string & iface_name,transaction_id id,const NanBootstrappingIndicationResponse & msg)1686 wifi_error WifiLegacyHal::nanBootstrappingIndicationResponse(
1687 const std::string& iface_name, transaction_id id,
1688 const NanBootstrappingIndicationResponse& msg) {
1689 NanBootstrappingIndicationResponse msg_internal(msg);
1690 return global_func_table_.wifi_nan_bootstrapping_indication_response(
1691 id, getIfaceHandle(iface_name), &msg_internal);
1692 }
1693
1694 typedef struct {
1695 u8 num_ndp_instances;
1696 NanDataPathId ndp_instance_id;
1697 } NanDataPathEndSingleNdpIdRequest;
1698
nanDataEnd(const std::string & iface_name,transaction_id id,uint32_t ndpInstanceId)1699 wifi_error WifiLegacyHal::nanDataEnd(const std::string& iface_name, transaction_id id,
1700 uint32_t ndpInstanceId) {
1701 NanDataPathEndSingleNdpIdRequest msg;
1702 msg.num_ndp_instances = 1;
1703 msg.ndp_instance_id = ndpInstanceId;
1704 wifi_error status = global_func_table_.wifi_nan_data_end(id, getIfaceHandle(iface_name),
1705 (NanDataPathEndRequest*)&msg);
1706 return status;
1707 }
1708
nanPairingEnd(const std::string & iface_name,transaction_id id,uint32_t pairingId)1709 wifi_error WifiLegacyHal::nanPairingEnd(const std::string& iface_name, transaction_id id,
1710 uint32_t pairingId) {
1711 NanPairingEndRequest msg;
1712 msg.pairing_instance_id = pairingId;
1713 wifi_error status =
1714 global_func_table_.wifi_nan_pairing_end(id, getIfaceHandle(iface_name), &msg);
1715 return status;
1716 }
1717
nanSuspendRequest(const std::string & iface_name,transaction_id id,const NanSuspendRequest & msg)1718 wifi_error WifiLegacyHal::nanSuspendRequest(const std::string& iface_name, transaction_id id,
1719 const NanSuspendRequest& msg) {
1720 NanSuspendRequest msg_internal(msg);
1721 wifi_error status = global_func_table_.wifi_nan_suspend_request(id, getIfaceHandle(iface_name),
1722 &msg_internal);
1723 return status;
1724 }
1725
nanResumeRequest(const std::string & iface_name,transaction_id id,const NanResumeRequest & msg)1726 wifi_error WifiLegacyHal::nanResumeRequest(const std::string& iface_name, transaction_id id,
1727 const NanResumeRequest& msg) {
1728 NanResumeRequest msg_internal(msg);
1729 wifi_error status = global_func_table_.wifi_nan_resume_request(id, getIfaceHandle(iface_name),
1730 &msg_internal);
1731 return status;
1732 }
1733
setCountryCode(const std::string & iface_name,const std::array<uint8_t,2> code)1734 wifi_error WifiLegacyHal::setCountryCode(const std::string& iface_name,
1735 const std::array<uint8_t, 2> code) {
1736 std::string code_str(code.data(), code.data() + code.size());
1737 return global_func_table_.wifi_set_country_code(getIfaceHandle(iface_name), code_str.c_str());
1738 }
1739
retrieveIfaceHandles()1740 wifi_error WifiLegacyHal::retrieveIfaceHandles() {
1741 wifi_interface_handle* iface_handles = nullptr;
1742 int num_iface_handles = 0;
1743 wifi_error status =
1744 global_func_table_.wifi_get_ifaces(global_handle_, &num_iface_handles, &iface_handles);
1745 if (status != WIFI_SUCCESS) {
1746 LOG(ERROR) << "Failed to enumerate interface handles";
1747 return status;
1748 }
1749 iface_name_to_handle_.clear();
1750 for (int i = 0; i < num_iface_handles; ++i) {
1751 std::array<char, IFNAMSIZ> iface_name_arr = {};
1752 status = global_func_table_.wifi_get_iface_name(iface_handles[i], iface_name_arr.data(),
1753 iface_name_arr.size());
1754 if (status != WIFI_SUCCESS) {
1755 LOG(WARNING) << "Failed to get interface handle name";
1756 continue;
1757 }
1758 // Assuming the interface name is null terminated since the legacy HAL
1759 // API does not return a size.
1760 std::string iface_name(iface_name_arr.data());
1761 LOG(INFO) << "Adding interface handle for " << iface_name;
1762 iface_name_to_handle_[iface_name] = iface_handles[i];
1763 }
1764 return WIFI_SUCCESS;
1765 }
1766
getIfaceHandle(const std::string & iface_name)1767 wifi_interface_handle WifiLegacyHal::getIfaceHandle(const std::string& iface_name) {
1768 const auto iface_handle_iter = iface_name_to_handle_.find(iface_name);
1769 if (iface_handle_iter == iface_name_to_handle_.end()) {
1770 LOG(ERROR) << "Unknown iface name: " << iface_name;
1771 return nullptr;
1772 }
1773 return iface_handle_iter->second;
1774 }
1775
runEventLoop()1776 void WifiLegacyHal::runEventLoop() {
1777 LOG(DEBUG) << "Starting legacy HAL event loop";
1778 global_func_table_.wifi_event_loop(global_handle_);
1779 const auto lock = aidl_sync_util::acquireGlobalLock();
1780 if (!awaiting_event_loop_termination_) {
1781 LOG(FATAL) << "Legacy HAL event loop terminated, but HAL was not stopping";
1782 }
1783 LOG(DEBUG) << "Legacy HAL event loop terminated";
1784 awaiting_event_loop_termination_ = false;
1785 stop_wait_cv_.notify_one();
1786 }
1787
getGscanCachedResults(const std::string & iface_name)1788 std::pair<wifi_error, std::vector<wifi_cached_scan_results>> WifiLegacyHal::getGscanCachedResults(
1789 const std::string& iface_name) {
1790 std::vector<wifi_cached_scan_results> cached_scan_results;
1791 cached_scan_results.resize(kMaxCachedGscanResults);
1792 int32_t num_results = 0;
1793 wifi_error status = global_func_table_.wifi_get_cached_gscan_results(
1794 getIfaceHandle(iface_name), true /* always flush */, cached_scan_results.size(),
1795 cached_scan_results.data(), &num_results);
1796 CHECK(num_results >= 0 && static_cast<uint32_t>(num_results) <= kMaxCachedGscanResults);
1797 cached_scan_results.resize(num_results);
1798 // Check for invalid IE lengths in these cached scan results and correct it.
1799 for (auto& cached_scan_result : cached_scan_results) {
1800 int num_scan_results = cached_scan_result.num_results;
1801 for (int i = 0; i < num_scan_results; i++) {
1802 auto& scan_result = cached_scan_result.results[i];
1803 if (scan_result.ie_length > 0) {
1804 LOG(DEBUG) << "Cached scan result has non-zero IE length " << scan_result.ie_length;
1805 scan_result.ie_length = 0;
1806 }
1807 }
1808 }
1809 return {status, std::move(cached_scan_results)};
1810 }
1811
createVirtualInterface(const std::string & ifname,wifi_interface_type iftype)1812 wifi_error WifiLegacyHal::createVirtualInterface(const std::string& ifname,
1813 wifi_interface_type iftype) {
1814 // Create the interface if it doesn't exist. If interface already exist,
1815 // Vendor Hal should return WIFI_SUCCESS.
1816 wifi_error status = global_func_table_.wifi_virtual_interface_create(global_handle_,
1817 ifname.c_str(), iftype);
1818 return handleVirtualInterfaceCreateOrDeleteStatus(ifname, status);
1819 }
1820
deleteVirtualInterface(const std::string & ifname)1821 wifi_error WifiLegacyHal::deleteVirtualInterface(const std::string& ifname) {
1822 // Delete the interface if it was created dynamically.
1823 wifi_error status =
1824 global_func_table_.wifi_virtual_interface_delete(global_handle_, ifname.c_str());
1825 return handleVirtualInterfaceCreateOrDeleteStatus(ifname, status);
1826 }
1827
handleVirtualInterfaceCreateOrDeleteStatus(const std::string & ifname,wifi_error status)1828 wifi_error WifiLegacyHal::handleVirtualInterfaceCreateOrDeleteStatus(const std::string& ifname,
1829 wifi_error status) {
1830 if (status == WIFI_SUCCESS) {
1831 // refresh list of handlers now.
1832 status = retrieveIfaceHandles();
1833 } else if (status == WIFI_ERROR_NOT_SUPPORTED) {
1834 // Vendor hal does not implement this API. Such vendor implementations
1835 // are expected to create / delete interface by other means.
1836
1837 // check if interface exists.
1838 if (if_nametoindex(ifname.c_str())) {
1839 status = retrieveIfaceHandles();
1840 }
1841 }
1842 return status;
1843 }
1844
getSupportedIfaceName(uint32_t iface_type,std::string & ifname)1845 wifi_error WifiLegacyHal::getSupportedIfaceName(uint32_t iface_type, std::string& ifname) {
1846 std::array<char, IFNAMSIZ> buffer;
1847
1848 wifi_error res = global_func_table_.wifi_get_supported_iface_name(
1849 global_handle_, (uint32_t)iface_type, buffer.data(), buffer.size());
1850 if (res == WIFI_SUCCESS) ifname = buffer.data();
1851
1852 return res;
1853 }
1854
multiStaSetPrimaryConnection(const std::string & ifname)1855 wifi_error WifiLegacyHal::multiStaSetPrimaryConnection(const std::string& ifname) {
1856 return global_func_table_.wifi_multi_sta_set_primary_connection(global_handle_,
1857 getIfaceHandle(ifname));
1858 }
1859
multiStaSetUseCase(wifi_multi_sta_use_case use_case)1860 wifi_error WifiLegacyHal::multiStaSetUseCase(wifi_multi_sta_use_case use_case) {
1861 return global_func_table_.wifi_multi_sta_set_use_case(global_handle_, use_case);
1862 }
1863
setCoexUnsafeChannels(std::vector<wifi_coex_unsafe_channel> unsafe_channels,uint32_t restrictions)1864 wifi_error WifiLegacyHal::setCoexUnsafeChannels(
1865 std::vector<wifi_coex_unsafe_channel> unsafe_channels, uint32_t restrictions) {
1866 return global_func_table_.wifi_set_coex_unsafe_channels(global_handle_, unsafe_channels.size(),
1867 unsafe_channels.data(), restrictions);
1868 }
1869
setVoipMode(const std::string & iface_name,wifi_voip_mode mode)1870 wifi_error WifiLegacyHal::setVoipMode(const std::string& iface_name, wifi_voip_mode mode) {
1871 return global_func_table_.wifi_set_voip_mode(getIfaceHandle(iface_name), mode);
1872 }
1873
twtGetCapabilities(const std::string & ifaceName)1874 std::pair<wifi_twt_capabilities, wifi_error> WifiLegacyHal::twtGetCapabilities(
1875 const std::string& ifaceName) {
1876 wifi_twt_capabilities capabs = {};
1877 wifi_error status =
1878 global_func_table_.wifi_twt_get_capabilities(getIfaceHandle(ifaceName), &capabs);
1879 return {capabs, status};
1880 }
1881
twtRegisterEvents(const std::string & ifaceName,const on_twt_failure & on_twt_failure_user_callback,const on_twt_session_create & on_twt_session_create_user_callback,const on_twt_session_update & on_twt_session_update_user_callback,const on_twt_session_teardown & on_twt_session_teardown_user_callback,const on_twt_session_stats & on_twt_session_stats_user_callback,const on_twt_session_suspend & on_twt_session_suspend_user_callback,const on_twt_session_resume & on_twt_session_resume_user_callback)1882 wifi_error WifiLegacyHal::twtRegisterEvents(
1883 const std::string& ifaceName, const on_twt_failure& on_twt_failure_user_callback,
1884 const on_twt_session_create& on_twt_session_create_user_callback,
1885 const on_twt_session_update& on_twt_session_update_user_callback,
1886 const on_twt_session_teardown& on_twt_session_teardown_user_callback,
1887 const on_twt_session_stats& on_twt_session_stats_user_callback,
1888 const on_twt_session_suspend& on_twt_session_suspend_user_callback,
1889 const on_twt_session_resume& on_twt_session_resume_user_callback) {
1890 if (on_twt_failure_internal_callback || on_twt_session_create_internal_callback ||
1891 on_twt_session_update_internal_callback || on_twt_session_teardown_internal_callback ||
1892 on_twt_session_stats_internal_callback) {
1893 return WIFI_ERROR_NOT_AVAILABLE;
1894 }
1895
1896 on_twt_failure_internal_callback = [on_twt_failure_user_callback](
1897 wifi_request_id id, wifi_twt_error_code error_code) {
1898 on_twt_failure_user_callback(id, error_code);
1899 };
1900
1901 on_twt_session_create_internal_callback = [on_twt_session_create_user_callback](
1902 wifi_request_id id,
1903 wifi_twt_session twt_session) {
1904 on_twt_session_create_user_callback(id, twt_session);
1905 };
1906
1907 on_twt_session_update_internal_callback = [on_twt_session_update_user_callback](
1908 wifi_request_id id,
1909 wifi_twt_session twt_session) {
1910 on_twt_session_update_user_callback(id, twt_session);
1911 };
1912
1913 on_twt_session_teardown_internal_callback = [on_twt_session_teardown_user_callback](
1914 wifi_request_id id, int session_id,
1915 wifi_twt_teardown_reason_code reason_code) {
1916 on_twt_session_teardown_user_callback(id, session_id, reason_code);
1917 };
1918
1919 on_twt_session_stats_internal_callback = [on_twt_session_stats_user_callback](
1920 wifi_request_id id, int session_id,
1921 wifi_twt_session_stats stats) {
1922 on_twt_session_stats_user_callback(id, session_id, stats);
1923 };
1924
1925 on_twt_session_suspend_internal_callback = [on_twt_session_suspend_user_callback](
1926 wifi_request_id id, int session_id) {
1927 on_twt_session_suspend_user_callback(id, session_id);
1928 };
1929
1930 on_twt_session_resume_internal_callback = [on_twt_session_resume_user_callback](
1931 wifi_request_id id, int session_id) {
1932 on_twt_session_resume_user_callback(id, session_id);
1933 };
1934
1935 return global_func_table_.wifi_twt_register_events(
1936 getIfaceHandle(ifaceName),
1937 {onAsyncTwtError, onAsyncTwtSessionCreate, onAsyncTwtSessionUpdate,
1938 onAsyncTwtSessionTeardown, onAsyncTwtSessionStats, onAsyncTwtSessionSuspend,
1939 onAsyncTwtSessionResume});
1940 }
1941
twtSessionSetup(const std::string & ifaceName,uint32_t cmdId,const wifi_twt_request & request)1942 wifi_error WifiLegacyHal::twtSessionSetup(const std::string& ifaceName, uint32_t cmdId,
1943 const wifi_twt_request& request) {
1944 return global_func_table_.wifi_twt_session_setup(cmdId, getIfaceHandle(ifaceName), request);
1945 }
1946
twtSessionUpdate(const std::string & ifaceName,uint32_t cmdId,uint32_t sessionId,const wifi_twt_request & request)1947 wifi_error WifiLegacyHal::twtSessionUpdate(const std::string& ifaceName, uint32_t cmdId,
1948 uint32_t sessionId, const wifi_twt_request& request) {
1949 return global_func_table_.wifi_twt_session_update(cmdId, getIfaceHandle(ifaceName), sessionId,
1950 request);
1951 }
1952
twtSessionSuspend(const std::string & ifaceName,uint32_t cmdId,uint32_t sessionId)1953 wifi_error WifiLegacyHal::twtSessionSuspend(const std::string& ifaceName, uint32_t cmdId,
1954 uint32_t sessionId) {
1955 return global_func_table_.wifi_twt_session_suspend(cmdId, getIfaceHandle(ifaceName), sessionId);
1956 }
1957
twtSessionResume(const std::string & ifaceName,uint32_t cmdId,uint32_t sessionId)1958 wifi_error WifiLegacyHal::twtSessionResume(const std::string& ifaceName, uint32_t cmdId,
1959 uint32_t sessionId) {
1960 return global_func_table_.wifi_twt_session_resume(cmdId, getIfaceHandle(ifaceName), sessionId);
1961 }
1962
twtSessionTeardown(const std::string & ifaceName,uint32_t cmdId,uint32_t sessionId)1963 wifi_error WifiLegacyHal::twtSessionTeardown(const std::string& ifaceName, uint32_t cmdId,
1964 uint32_t sessionId) {
1965 return global_func_table_.wifi_twt_session_teardown(cmdId, getIfaceHandle(ifaceName),
1966 sessionId);
1967 }
1968
twtSessionGetStats(const std::string & ifaceName,uint32_t cmdId,uint32_t sessionId)1969 wifi_error WifiLegacyHal::twtSessionGetStats(const std::string& ifaceName, uint32_t cmdId,
1970 uint32_t sessionId) {
1971 return global_func_table_.wifi_twt_session_get_stats(cmdId, getIfaceHandle(ifaceName),
1972 sessionId);
1973 }
1974
twtRegisterHandler(const std::string & iface_name,const TwtCallbackHandlers & user_callbacks)1975 wifi_error WifiLegacyHal::twtRegisterHandler(const std::string& iface_name,
1976 const TwtCallbackHandlers& user_callbacks) {
1977 on_twt_event_setup_response_callback = user_callbacks.on_setup_response;
1978 on_twt_event_teardown_completion_callback = user_callbacks.on_teardown_completion;
1979 on_twt_event_info_frame_received_callback = user_callbacks.on_info_frame_received;
1980 on_twt_event_device_notify_callback = user_callbacks.on_device_notify;
1981
1982 return global_func_table_.wifi_twt_register_handler(
1983 getIfaceHandle(iface_name),
1984 {onAsyncTwtEventSetupResponse, onAsyncTwtEventTeardownCompletion,
1985 onAsyncTwtEventInfoFrameReceived, onAsyncTwtEventDeviceNotify});
1986 }
1987
twtGetCapability(const std::string & iface_name)1988 std::pair<wifi_error, TwtCapabilitySet> WifiLegacyHal::twtGetCapability(
1989 const std::string& iface_name) {
1990 TwtCapabilitySet capSet;
1991 wifi_error status =
1992 global_func_table_.wifi_twt_get_capability(getIfaceHandle(iface_name), &capSet);
1993 return {status, capSet};
1994 }
1995
twtSetupRequest(const std::string & iface_name,const TwtSetupRequest & msg)1996 wifi_error WifiLegacyHal::twtSetupRequest(const std::string& iface_name,
1997 const TwtSetupRequest& msg) {
1998 TwtSetupRequest msgInternal(msg);
1999 return global_func_table_.wifi_twt_setup_request(getIfaceHandle(iface_name), &msgInternal);
2000 }
2001
twtTearDownRequest(const std::string & iface_name,const TwtTeardownRequest & msg)2002 wifi_error WifiLegacyHal::twtTearDownRequest(const std::string& iface_name,
2003 const TwtTeardownRequest& msg) {
2004 TwtTeardownRequest msgInternal(msg);
2005 return global_func_table_.wifi_twt_teardown_request(getIfaceHandle(iface_name), &msgInternal);
2006 }
2007
twtInfoFrameRequest(const std::string & iface_name,const TwtInfoFrameRequest & msg)2008 wifi_error WifiLegacyHal::twtInfoFrameRequest(const std::string& iface_name,
2009 const TwtInfoFrameRequest& msg) {
2010 TwtInfoFrameRequest msgInternal(msg);
2011 return global_func_table_.wifi_twt_info_frame_request(getIfaceHandle(iface_name), &msgInternal);
2012 }
2013
twtGetStats(const std::string & iface_name,uint8_t configId)2014 std::pair<wifi_error, TwtStats> WifiLegacyHal::twtGetStats(const std::string& iface_name,
2015 uint8_t configId) {
2016 TwtStats stats;
2017 wifi_error status =
2018 global_func_table_.wifi_twt_get_stats(getIfaceHandle(iface_name), configId, &stats);
2019 return {status, stats};
2020 }
2021
twtClearStats(const std::string & iface_name,uint8_t configId)2022 wifi_error WifiLegacyHal::twtClearStats(const std::string& iface_name, uint8_t configId) {
2023 return global_func_table_.wifi_twt_clear_stats(getIfaceHandle(iface_name), configId);
2024 }
2025
setScanMode(const std::string & iface_name,bool enable)2026 wifi_error WifiLegacyHal::setScanMode(const std::string& iface_name, bool enable) {
2027 return global_func_table_.wifi_set_scan_mode(getIfaceHandle(iface_name), enable);
2028 }
2029
setDtimConfig(const std::string & iface_name,uint32_t multiplier)2030 wifi_error WifiLegacyHal::setDtimConfig(const std::string& iface_name, uint32_t multiplier) {
2031 return global_func_table_.wifi_set_dtim_config(getIfaceHandle(iface_name), multiplier);
2032 }
2033
getUsableChannels(uint32_t band_mask,uint32_t iface_mode_mask,uint32_t filter_mask)2034 std::pair<wifi_error, std::vector<wifi_usable_channel>> WifiLegacyHal::getUsableChannels(
2035 uint32_t band_mask, uint32_t iface_mode_mask, uint32_t filter_mask) {
2036 std::vector<wifi_usable_channel> channels;
2037 channels.resize(kMaxWifiUsableChannels);
2038 uint32_t size = 0;
2039 wifi_error status = global_func_table_.wifi_get_usable_channels(
2040 global_handle_, band_mask, iface_mode_mask, filter_mask, channels.size(), &size,
2041 reinterpret_cast<wifi_usable_channel*>(channels.data()));
2042 CHECK(size >= 0 && size <= kMaxWifiUsableChannels);
2043 channels.resize(size);
2044 return {status, std::move(channels)};
2045 }
2046
triggerSubsystemRestart()2047 wifi_error WifiLegacyHal::triggerSubsystemRestart() {
2048 return global_func_table_.wifi_trigger_subsystem_restart(global_handle_);
2049 }
2050
setIndoorState(bool isIndoor)2051 wifi_error WifiLegacyHal::setIndoorState(bool isIndoor) {
2052 return global_func_table_.wifi_set_indoor_state(global_handle_, isIndoor);
2053 }
2054
2055 std::pair<wifi_error, wifi_radio_combination_matrix*>
getSupportedRadioCombinationsMatrix()2056 WifiLegacyHal::getSupportedRadioCombinationsMatrix() {
2057 char* buffer = new char[kMaxSupportedRadioCombinationsMatrixLength];
2058 std::fill(buffer, buffer + kMaxSupportedRadioCombinationsMatrixLength, 0);
2059 uint32_t size = 0;
2060 wifi_radio_combination_matrix* radio_combination_matrix_ptr =
2061 reinterpret_cast<wifi_radio_combination_matrix*>(buffer);
2062 wifi_error status = global_func_table_.wifi_get_supported_radio_combinations_matrix(
2063 global_handle_, kMaxSupportedRadioCombinationsMatrixLength, &size,
2064 radio_combination_matrix_ptr);
2065 CHECK(size >= 0 && size <= kMaxSupportedRadioCombinationsMatrixLength);
2066 return {status, radio_combination_matrix_ptr};
2067 }
2068
chreNanRttRequest(const std::string & iface_name,bool enable)2069 wifi_error WifiLegacyHal::chreNanRttRequest(const std::string& iface_name, bool enable) {
2070 if (enable)
2071 return global_func_table_.wifi_nan_rtt_chre_enable_request(0, getIfaceHandle(iface_name),
2072 NULL);
2073 else
2074 return global_func_table_.wifi_nan_rtt_chre_disable_request(0, getIfaceHandle(iface_name));
2075 }
2076
chreRegisterHandler(const std::string & iface_name,const ChreCallbackHandlers & handler)2077 wifi_error WifiLegacyHal::chreRegisterHandler(const std::string& iface_name,
2078 const ChreCallbackHandlers& handler) {
2079 if (on_chre_nan_rtt_internal_callback) {
2080 return WIFI_ERROR_NOT_AVAILABLE;
2081 }
2082
2083 on_chre_nan_rtt_internal_callback = handler.on_wifi_chre_nan_rtt_state;
2084
2085 wifi_error status = global_func_table_.wifi_chre_register_handler(getIfaceHandle(iface_name),
2086 {onAsyncChreNanRttState});
2087 if (status != WIFI_SUCCESS) {
2088 on_chre_nan_rtt_internal_callback = nullptr;
2089 }
2090 return status;
2091 }
2092
enableWifiTxPowerLimits(const std::string & iface_name,bool enable)2093 wifi_error WifiLegacyHal::enableWifiTxPowerLimits(const std::string& iface_name, bool enable) {
2094 return global_func_table_.wifi_enable_tx_power_limits(getIfaceHandle(iface_name), enable);
2095 }
2096
getWifiCachedScanResults(const std::string & iface_name,WifiCachedScanReport & report)2097 wifi_error WifiLegacyHal::getWifiCachedScanResults(const std::string& iface_name,
2098 WifiCachedScanReport& report) {
2099 on_cached_scan_results_internal_callback = [&report](wifi_cached_scan_report* report_ptr) {
2100 report.results.assign(report_ptr->results, report_ptr->results + report_ptr->result_cnt);
2101 report.scanned_freqs.assign(report_ptr->scanned_freq_list,
2102 report_ptr->scanned_freq_list + report_ptr->scanned_freq_num);
2103 report.ts = report_ptr->ts;
2104 };
2105 wifi_error status = global_func_table_.wifi_get_cached_scan_results(getIfaceHandle(iface_name),
2106 {onSyncCachedScanResults});
2107 on_cached_scan_results_internal_callback = nullptr;
2108 return status;
2109 }
2110
getWifiChipCapabilities()2111 std::pair<wifi_error, wifi_chip_capabilities> WifiLegacyHal::getWifiChipCapabilities() {
2112 wifi_chip_capabilities chip_capabilities;
2113 wifi_error status =
2114 global_func_table_.wifi_get_chip_capabilities(global_handle_, &chip_capabilities);
2115 return {status, chip_capabilities};
2116 }
2117
enableStaChannelForPeerNetwork(uint32_t channelCategoryEnableFlag)2118 wifi_error WifiLegacyHal::enableStaChannelForPeerNetwork(uint32_t channelCategoryEnableFlag) {
2119 return global_func_table_.wifi_enable_sta_channel_for_peer_network(global_handle_,
2120 channelCategoryEnableFlag);
2121 }
2122
setMloMode(wifi_mlo_mode mode)2123 wifi_error WifiLegacyHal::setMloMode(wifi_mlo_mode mode) {
2124 return global_func_table_.wifi_set_mlo_mode(global_handle_, mode);
2125 }
2126
2127 std::pair<wifi_error, wifi_iface_concurrency_matrix>
getSupportedIfaceConcurrencyMatrix()2128 WifiLegacyHal::getSupportedIfaceConcurrencyMatrix() {
2129 wifi_iface_concurrency_matrix iface_concurrency_matrix;
2130 wifi_error status = global_func_table_.wifi_get_supported_iface_concurrency_matrix(
2131 global_handle_, &iface_concurrency_matrix);
2132 return {status, iface_concurrency_matrix};
2133 }
2134
invalidate()2135 void WifiLegacyHal::invalidate() {
2136 global_handle_ = nullptr;
2137 iface_name_to_handle_.clear();
2138 on_driver_memory_dump_internal_callback = nullptr;
2139 on_firmware_memory_dump_internal_callback = nullptr;
2140 on_gscan_event_internal_callback = nullptr;
2141 on_gscan_full_result_internal_callback = nullptr;
2142 on_link_layer_stats_result_internal_callback = nullptr;
2143 on_link_layer_ml_stats_result_internal_callback = nullptr;
2144 on_rssi_threshold_breached_internal_callback = nullptr;
2145 on_ring_buffer_data_internal_callback = nullptr;
2146 on_error_alert_internal_callback = nullptr;
2147 on_radio_mode_change_internal_callback = nullptr;
2148 on_subsystem_restart_internal_callback = nullptr;
2149 invalidateRttResultsCallbacks();
2150 on_nan_notify_response_user_callback = nullptr;
2151 on_nan_event_publish_terminated_user_callback = nullptr;
2152 on_nan_event_match_user_callback = nullptr;
2153 on_nan_event_match_expired_user_callback = nullptr;
2154 on_nan_event_subscribe_terminated_user_callback = nullptr;
2155 on_nan_event_followup_user_callback = nullptr;
2156 on_nan_event_disc_eng_event_user_callback = nullptr;
2157 on_nan_event_disabled_user_callback = nullptr;
2158 on_nan_event_tca_user_callback = nullptr;
2159 on_nan_event_beacon_sdf_payload_user_callback = nullptr;
2160 on_nan_event_data_path_request_user_callback = nullptr;
2161 on_nan_event_pairing_request_user_callback = nullptr;
2162 on_nan_event_pairing_confirm_user_callback = nullptr;
2163 on_nan_event_bootstrapping_request_user_callback = nullptr;
2164 on_nan_event_bootstrapping_confirm_user_callback = nullptr;
2165 on_nan_event_data_path_confirm_user_callback = nullptr;
2166 on_nan_event_data_path_end_user_callback = nullptr;
2167 on_nan_event_transmit_follow_up_user_callback = nullptr;
2168 on_nan_event_range_request_user_callback = nullptr;
2169 on_nan_event_range_report_user_callback = nullptr;
2170 on_nan_event_schedule_update_user_callback = nullptr;
2171 on_twt_event_setup_response_callback = nullptr;
2172 on_twt_event_teardown_completion_callback = nullptr;
2173 on_twt_event_info_frame_received_callback = nullptr;
2174 on_twt_event_device_notify_callback = nullptr;
2175 on_chre_nan_rtt_internal_callback = nullptr;
2176 on_cached_scan_results_internal_callback = nullptr;
2177 }
2178
2179 } // namespace legacy_hal
2180 } // namespace wifi
2181 } // namespace hardware
2182 } // namespace android
2183 } // namespace aidl
2184