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