xref: /aosp_15_r20/hardware/interfaces/wifi/aidl/default/wifi_legacy_hal.cpp (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
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