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