blob: d0d285b6a56a5d2b4116c8a51423eee9f3acd0f2 [file] [log] [blame]
Roshan Piusaabe5752016-09-29 09:03:59 -07001/*
2 * Copyright (C) 2016 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 <array>
Roshan Pius155344b2017-08-11 15:47:42 -070018#include <chrono>
Roshan Piusaabe5752016-09-29 09:03:59 -070019
Roshan Piusaabe5752016-09-29 09:03:59 -070020#include <android-base/logging.h>
Roshan Piusaabe5752016-09-29 09:03:59 -070021
Roshan Pius091e1c12017-01-30 16:40:50 -080022#include "hidl_sync_util.h"
Roshan Pius955542e2016-10-28 09:42:44 -070023#include "wifi_legacy_hal.h"
Roshan Piuse73a5062016-12-12 08:53:34 -080024#include "wifi_legacy_hal_stubs.h"
Roshan Pius97334112016-11-18 14:07:54 -080025
Roshan Pius32fc12e2017-01-25 17:44:42 -080026namespace {
Roshan Pius76ff3022016-10-28 10:33:34 -070027// Constants ported over from the legacy HAL calling code
28// (com_android_server_wifi_WifiNative.cpp). This will all be thrown
29// away when this shim layer is replaced by the real vendor
30// implementation.
Roshan Pius511cc492016-10-28 09:54:26 -070031static constexpr uint32_t kMaxVersionStringLength = 256;
Roshan Pius76ff3022016-10-28 10:33:34 -070032static constexpr uint32_t kMaxCachedGscanResults = 64;
33static constexpr uint32_t kMaxGscanFrequenciesForBand = 64;
Roshan Pius7cece412016-10-28 10:38:21 -070034static constexpr uint32_t kLinkLayerStatsDataMpduSizeThreshold = 128;
Roshan Pius8714a3e2016-10-28 10:43:51 -070035static constexpr uint32_t kMaxWakeReasonStatsArraySize = 32;
36static constexpr uint32_t kMaxRingBuffers = 10;
Roshan Pius9bd4e6b2017-09-29 15:04:33 -070037static constexpr uint32_t kMaxStopCompleteWaitMs = 100;
Roshan Pius511cc492016-10-28 09:54:26 -070038
Roshan Pius32fc12e2017-01-25 17:44:42 -080039// Helper function to create a non-const char* for legacy Hal API's.
40std::vector<char> makeCharVec(const std::string& str) {
41 std::vector<char> vec(str.size() + 1);
42 vec.assign(str.begin(), str.end());
43 vec.push_back('\0');
44 return vec;
45}
46} // namespace
47
48namespace android {
49namespace hardware {
50namespace wifi {
Etan Cohen6ce50902017-09-14 07:30:57 -070051namespace V1_2 {
Roshan Pius32fc12e2017-01-25 17:44:42 -080052namespace implementation {
53namespace legacy_hal {
Roshan Piusaabe5752016-09-29 09:03:59 -070054// Legacy HAL functions accept "C" style function pointers, so use global
55// functions to pass to the legacy HAL function and store the corresponding
56// std::function methods to be invoked.
Roshan Pius155344b2017-08-11 15:47:42 -070057//
58// Callback to be invoked once |stop| is complete
Roshan Piusaabe5752016-09-29 09:03:59 -070059std::function<void(wifi_handle handle)> on_stop_complete_internal_callback;
Roshan Pius091e1c12017-01-30 16:40:50 -080060void onAsyncStopComplete(wifi_handle handle) {
61 const auto lock = hidl_sync_util::acquireGlobalLock();
Roshan Piusaabe5752016-09-29 09:03:59 -070062 if (on_stop_complete_internal_callback) {
63 on_stop_complete_internal_callback(handle);
Roshan Pius46b64542017-03-09 13:09:49 -080064 // Invalidate this callback since we don't want this firing again.
65 on_stop_complete_internal_callback = nullptr;
Roshan Piusaabe5752016-09-29 09:03:59 -070066 }
67}
Roshan Piuscdb77f32016-10-03 14:09:57 -070068
69// Callback to be invoked for driver dump.
70std::function<void(char*, int)> on_driver_memory_dump_internal_callback;
Roshan Pius091e1c12017-01-30 16:40:50 -080071void onSyncDriverMemoryDump(char* buffer, int buffer_size) {
Roshan Piuscdb77f32016-10-03 14:09:57 -070072 if (on_driver_memory_dump_internal_callback) {
73 on_driver_memory_dump_internal_callback(buffer, buffer_size);
74 }
75}
76
77// Callback to be invoked for firmware dump.
78std::function<void(char*, int)> on_firmware_memory_dump_internal_callback;
Roshan Pius091e1c12017-01-30 16:40:50 -080079void onSyncFirmwareMemoryDump(char* buffer, int buffer_size) {
Roshan Piuscdb77f32016-10-03 14:09:57 -070080 if (on_firmware_memory_dump_internal_callback) {
81 on_firmware_memory_dump_internal_callback(buffer, buffer_size);
82 }
83}
Roshan Pius76ff3022016-10-28 10:33:34 -070084
85// Callback to be invoked for Gscan events.
86std::function<void(wifi_request_id, wifi_scan_event)>
87 on_gscan_event_internal_callback;
Roshan Pius091e1c12017-01-30 16:40:50 -080088void onAsyncGscanEvent(wifi_request_id id, wifi_scan_event event) {
89 const auto lock = hidl_sync_util::acquireGlobalLock();
Roshan Pius76ff3022016-10-28 10:33:34 -070090 if (on_gscan_event_internal_callback) {
91 on_gscan_event_internal_callback(id, event);
92 }
93}
94
95// Callback to be invoked for Gscan full results.
96std::function<void(wifi_request_id, wifi_scan_result*, uint32_t)>
97 on_gscan_full_result_internal_callback;
Roshan Pius091e1c12017-01-30 16:40:50 -080098void onAsyncGscanFullResult(wifi_request_id id,
99 wifi_scan_result* result,
100 uint32_t buckets_scanned) {
101 const auto lock = hidl_sync_util::acquireGlobalLock();
Roshan Pius76ff3022016-10-28 10:33:34 -0700102 if (on_gscan_full_result_internal_callback) {
103 on_gscan_full_result_internal_callback(id, result, buckets_scanned);
104 }
105}
106
Roshan Pius7cece412016-10-28 10:38:21 -0700107// Callback to be invoked for link layer stats results.
108std::function<void((wifi_request_id, wifi_iface_stat*, int, wifi_radio_stat*))>
109 on_link_layer_stats_result_internal_callback;
Roshan Pius091e1c12017-01-30 16:40:50 -0800110void onSyncLinkLayerStatsResult(wifi_request_id id,
111 wifi_iface_stat* iface_stat,
112 int num_radios,
113 wifi_radio_stat* radio_stat) {
Roshan Pius7cece412016-10-28 10:38:21 -0700114 if (on_link_layer_stats_result_internal_callback) {
115 on_link_layer_stats_result_internal_callback(
116 id, iface_stat, num_radios, radio_stat);
117 }
118}
119
Roshan Piusd4767542016-12-06 10:04:05 -0800120// Callback to be invoked for rssi threshold breach.
121std::function<void((wifi_request_id, uint8_t*, int8_t))>
122 on_rssi_threshold_breached_internal_callback;
Roshan Pius091e1c12017-01-30 16:40:50 -0800123void onAsyncRssiThresholdBreached(wifi_request_id id,
124 uint8_t* bssid,
125 int8_t rssi) {
126 const auto lock = hidl_sync_util::acquireGlobalLock();
Roshan Piusd4767542016-12-06 10:04:05 -0800127 if (on_rssi_threshold_breached_internal_callback) {
128 on_rssi_threshold_breached_internal_callback(id, bssid, rssi);
129 }
130}
131
Roshan Pius8714a3e2016-10-28 10:43:51 -0700132// Callback to be invoked for ring buffer data indication.
133std::function<void(char*, char*, int, wifi_ring_buffer_status*)>
134 on_ring_buffer_data_internal_callback;
Roshan Pius091e1c12017-01-30 16:40:50 -0800135void onAsyncRingBufferData(char* ring_name,
136 char* buffer,
137 int buffer_size,
138 wifi_ring_buffer_status* status) {
139 const auto lock = hidl_sync_util::acquireGlobalLock();
Roshan Pius8714a3e2016-10-28 10:43:51 -0700140 if (on_ring_buffer_data_internal_callback) {
141 on_ring_buffer_data_internal_callback(
142 ring_name, buffer, buffer_size, status);
143 }
144}
145
Roshan Pius203cb032016-12-14 17:41:20 -0800146// Callback to be invoked for error alert indication.
147std::function<void(wifi_request_id, char*, int, int)>
148 on_error_alert_internal_callback;
Roshan Pius091e1c12017-01-30 16:40:50 -0800149void onAsyncErrorAlert(wifi_request_id id,
150 char* buffer,
151 int buffer_size,
152 int err_code) {
153 const auto lock = hidl_sync_util::acquireGlobalLock();
Roshan Pius203cb032016-12-14 17:41:20 -0800154 if (on_error_alert_internal_callback) {
155 on_error_alert_internal_callback(id, buffer, buffer_size, err_code);
156 }
157}
158
Roshan Piusd8e915a2016-10-28 11:23:11 -0700159// Callback to be invoked for rtt results results.
160std::function<void(
161 wifi_request_id, unsigned num_results, wifi_rtt_result* rtt_results[])>
162 on_rtt_results_internal_callback;
Roshan Pius091e1c12017-01-30 16:40:50 -0800163void onAsyncRttResults(wifi_request_id id,
164 unsigned num_results,
165 wifi_rtt_result* rtt_results[]) {
166 const auto lock = hidl_sync_util::acquireGlobalLock();
Roshan Piusd8e915a2016-10-28 11:23:11 -0700167 if (on_rtt_results_internal_callback) {
168 on_rtt_results_internal_callback(id, num_results, rtt_results);
Wei Wang8c50b5a2017-04-24 19:03:24 -0700169 on_rtt_results_internal_callback = nullptr;
Roshan Piusd8e915a2016-10-28 11:23:11 -0700170 }
171}
172
Roshan Pius23012092016-10-28 11:27:40 -0700173// Callbacks for the various NAN operations.
174// NOTE: These have very little conversions to perform before invoking the user
175// callbacks.
176// So, handle all of them here directly to avoid adding an unnecessary layer.
177std::function<void(transaction_id, const NanResponseMsg&)>
178 on_nan_notify_response_user_callback;
Roshan Pius091e1c12017-01-30 16:40:50 -0800179void onAysncNanNotifyResponse(transaction_id id, NanResponseMsg* msg) {
180 const auto lock = hidl_sync_util::acquireGlobalLock();
Roshan Pius23012092016-10-28 11:27:40 -0700181 if (on_nan_notify_response_user_callback && msg) {
182 on_nan_notify_response_user_callback(id, *msg);
183 }
184}
185
Etan Cohen20925b02017-04-04 13:00:14 -0700186std::function<void(const NanPublishRepliedInd&)>
187 on_nan_event_publish_replied_user_callback;
188void onAysncNanEventPublishReplied(NanPublishRepliedInd* /* event */) {
189 LOG(ERROR) << "onAysncNanEventPublishReplied triggered";
190}
191
Roshan Pius23012092016-10-28 11:27:40 -0700192std::function<void(const NanPublishTerminatedInd&)>
193 on_nan_event_publish_terminated_user_callback;
Roshan Pius091e1c12017-01-30 16:40:50 -0800194void onAysncNanEventPublishTerminated(NanPublishTerminatedInd* event) {
195 const auto lock = hidl_sync_util::acquireGlobalLock();
Roshan Pius23012092016-10-28 11:27:40 -0700196 if (on_nan_event_publish_terminated_user_callback && event) {
197 on_nan_event_publish_terminated_user_callback(*event);
198 }
199}
200
201std::function<void(const NanMatchInd&)> on_nan_event_match_user_callback;
Roshan Pius091e1c12017-01-30 16:40:50 -0800202void onAysncNanEventMatch(NanMatchInd* event) {
203 const auto lock = hidl_sync_util::acquireGlobalLock();
Roshan Pius23012092016-10-28 11:27:40 -0700204 if (on_nan_event_match_user_callback && event) {
205 on_nan_event_match_user_callback(*event);
206 }
207}
208
209std::function<void(const NanMatchExpiredInd&)>
210 on_nan_event_match_expired_user_callback;
Roshan Pius091e1c12017-01-30 16:40:50 -0800211void onAysncNanEventMatchExpired(NanMatchExpiredInd* event) {
212 const auto lock = hidl_sync_util::acquireGlobalLock();
Roshan Pius23012092016-10-28 11:27:40 -0700213 if (on_nan_event_match_expired_user_callback && event) {
214 on_nan_event_match_expired_user_callback(*event);
215 }
216}
217
218std::function<void(const NanSubscribeTerminatedInd&)>
219 on_nan_event_subscribe_terminated_user_callback;
Roshan Pius091e1c12017-01-30 16:40:50 -0800220void onAysncNanEventSubscribeTerminated(NanSubscribeTerminatedInd* event) {
221 const auto lock = hidl_sync_util::acquireGlobalLock();
Roshan Pius23012092016-10-28 11:27:40 -0700222 if (on_nan_event_subscribe_terminated_user_callback && event) {
223 on_nan_event_subscribe_terminated_user_callback(*event);
224 }
225}
226
227std::function<void(const NanFollowupInd&)> on_nan_event_followup_user_callback;
Roshan Pius091e1c12017-01-30 16:40:50 -0800228void onAysncNanEventFollowup(NanFollowupInd* event) {
229 const auto lock = hidl_sync_util::acquireGlobalLock();
Roshan Pius23012092016-10-28 11:27:40 -0700230 if (on_nan_event_followup_user_callback && event) {
231 on_nan_event_followup_user_callback(*event);
232 }
233}
234
235std::function<void(const NanDiscEngEventInd&)>
236 on_nan_event_disc_eng_event_user_callback;
Roshan Pius091e1c12017-01-30 16:40:50 -0800237void onAysncNanEventDiscEngEvent(NanDiscEngEventInd* event) {
238 const auto lock = hidl_sync_util::acquireGlobalLock();
Roshan Pius23012092016-10-28 11:27:40 -0700239 if (on_nan_event_disc_eng_event_user_callback && event) {
240 on_nan_event_disc_eng_event_user_callback(*event);
241 }
242}
243
244std::function<void(const NanDisabledInd&)> on_nan_event_disabled_user_callback;
Roshan Pius091e1c12017-01-30 16:40:50 -0800245void onAysncNanEventDisabled(NanDisabledInd* event) {
246 const auto lock = hidl_sync_util::acquireGlobalLock();
Roshan Pius23012092016-10-28 11:27:40 -0700247 if (on_nan_event_disabled_user_callback && event) {
248 on_nan_event_disabled_user_callback(*event);
249 }
250}
251
252std::function<void(const NanTCAInd&)> on_nan_event_tca_user_callback;
Roshan Pius091e1c12017-01-30 16:40:50 -0800253void onAysncNanEventTca(NanTCAInd* event) {
254 const auto lock = hidl_sync_util::acquireGlobalLock();
Roshan Pius23012092016-10-28 11:27:40 -0700255 if (on_nan_event_tca_user_callback && event) {
256 on_nan_event_tca_user_callback(*event);
257 }
258}
259
260std::function<void(const NanBeaconSdfPayloadInd&)>
261 on_nan_event_beacon_sdf_payload_user_callback;
Roshan Pius091e1c12017-01-30 16:40:50 -0800262void onAysncNanEventBeaconSdfPayload(NanBeaconSdfPayloadInd* event) {
263 const auto lock = hidl_sync_util::acquireGlobalLock();
Roshan Pius23012092016-10-28 11:27:40 -0700264 if (on_nan_event_beacon_sdf_payload_user_callback && event) {
265 on_nan_event_beacon_sdf_payload_user_callback(*event);
266 }
267}
268
269std::function<void(const NanDataPathRequestInd&)>
270 on_nan_event_data_path_request_user_callback;
Roshan Pius091e1c12017-01-30 16:40:50 -0800271void onAysncNanEventDataPathRequest(NanDataPathRequestInd* event) {
272 const auto lock = hidl_sync_util::acquireGlobalLock();
Roshan Pius23012092016-10-28 11:27:40 -0700273 if (on_nan_event_data_path_request_user_callback && event) {
274 on_nan_event_data_path_request_user_callback(*event);
275 }
276}
277std::function<void(const NanDataPathConfirmInd&)>
278 on_nan_event_data_path_confirm_user_callback;
Roshan Pius091e1c12017-01-30 16:40:50 -0800279void onAysncNanEventDataPathConfirm(NanDataPathConfirmInd* event) {
280 const auto lock = hidl_sync_util::acquireGlobalLock();
Roshan Pius23012092016-10-28 11:27:40 -0700281 if (on_nan_event_data_path_confirm_user_callback && event) {
282 on_nan_event_data_path_confirm_user_callback(*event);
283 }
284}
285
286std::function<void(const NanDataPathEndInd&)>
287 on_nan_event_data_path_end_user_callback;
Roshan Pius091e1c12017-01-30 16:40:50 -0800288void onAysncNanEventDataPathEnd(NanDataPathEndInd* event) {
289 const auto lock = hidl_sync_util::acquireGlobalLock();
Roshan Pius23012092016-10-28 11:27:40 -0700290 if (on_nan_event_data_path_end_user_callback && event) {
291 on_nan_event_data_path_end_user_callback(*event);
292 }
293}
294
295std::function<void(const NanTransmitFollowupInd&)>
296 on_nan_event_transmit_follow_up_user_callback;
Roshan Pius091e1c12017-01-30 16:40:50 -0800297void onAysncNanEventTransmitFollowUp(NanTransmitFollowupInd* event) {
298 const auto lock = hidl_sync_util::acquireGlobalLock();
Roshan Pius23012092016-10-28 11:27:40 -0700299 if (on_nan_event_transmit_follow_up_user_callback && event) {
300 on_nan_event_transmit_follow_up_user_callback(*event);
301 }
302}
Etan Cohenc190f932017-02-17 13:06:55 -0800303
304std::function<void(const NanRangeRequestInd&)>
305 on_nan_event_range_request_user_callback;
306void onAysncNanEventRangeRequest(NanRangeRequestInd* event) {
307 const auto lock = hidl_sync_util::acquireGlobalLock();
308 if (on_nan_event_range_request_user_callback && event) {
309 on_nan_event_range_request_user_callback(*event);
310 }
311}
312
313std::function<void(const NanRangeReportInd&)>
314 on_nan_event_range_report_user_callback;
315void onAysncNanEventRangeReport(NanRangeReportInd* event) {
316 const auto lock = hidl_sync_util::acquireGlobalLock();
317 if (on_nan_event_range_report_user_callback && event) {
318 on_nan_event_range_report_user_callback(*event);
319 }
320}
Roshan Pius955542e2016-10-28 09:42:44 -0700321// End of the free-standing "C" style callbacks.
Roshan Piusaabe5752016-09-29 09:03:59 -0700322
Roshan Piusaabe5752016-09-29 09:03:59 -0700323WifiLegacyHal::WifiLegacyHal()
324 : global_handle_(nullptr),
325 wlan_interface_handle_(nullptr),
Roshan Pius11f93032016-12-09 10:26:17 -0800326 awaiting_event_loop_termination_(false),
327 is_started_(false) {}
Roshan Piusaabe5752016-09-29 09:03:59 -0700328
Roshan Pius97334112016-11-18 14:07:54 -0800329wifi_error WifiLegacyHal::initialize() {
Roshan Pius11f93032016-12-09 10:26:17 -0800330 LOG(DEBUG) << "Initialize legacy HAL";
Roshan Pius955542e2016-10-28 09:42:44 -0700331 // TODO: Add back the HAL Tool if we need to. All we need from the HAL tool
332 // for now is this function call which we can directly call.
Roshan Piuse73a5062016-12-12 08:53:34 -0800333 if (!initHalFuncTableWithStubs(&global_func_table_)) {
334 LOG(ERROR) << "Failed to initialize legacy hal function table with stubs";
335 return WIFI_ERROR_UNKNOWN;
336 }
Roshan Pius955542e2016-10-28 09:42:44 -0700337 wifi_error status = init_wifi_vendor_hal_func_table(&global_func_table_);
338 if (status != WIFI_SUCCESS) {
Roshan Pius908a69a2016-10-03 13:33:23 -0700339 LOG(ERROR) << "Failed to initialize legacy hal function table";
Roshan Pius908a69a2016-10-03 13:33:23 -0700340 }
Roshan Piusa1c76e42017-03-20 10:15:18 -0700341 return status;
Roshan Pius97334112016-11-18 14:07:54 -0800342}
343
344wifi_error WifiLegacyHal::start() {
345 // Ensure that we're starting in a good state.
346 CHECK(global_func_table_.wifi_initialize && !global_handle_ &&
347 !wlan_interface_handle_ && !awaiting_event_loop_termination_);
Roshan Pius11f93032016-12-09 10:26:17 -0800348 if (is_started_) {
349 LOG(DEBUG) << "Legacy HAL already started";
350 return WIFI_SUCCESS;
351 }
352 LOG(DEBUG) << "Starting legacy HAL";
Roshan Pius97334112016-11-18 14:07:54 -0800353 if (!iface_tool_.SetWifiUpState(true)) {
Roshan Pius908a69a2016-10-03 13:33:23 -0700354 LOG(ERROR) << "Failed to set WiFi interface up";
355 return WIFI_ERROR_UNKNOWN;
356 }
Roshan Pius97334112016-11-18 14:07:54 -0800357 wifi_error status = global_func_table_.wifi_initialize(&global_handle_);
Roshan Piusaabe5752016-09-29 09:03:59 -0700358 if (status != WIFI_SUCCESS || !global_handle_) {
359 LOG(ERROR) << "Failed to retrieve global handle";
360 return status;
361 }
Roshan Pius11f93032016-12-09 10:26:17 -0800362 std::thread(&WifiLegacyHal::runEventLoop, this).detach();
Roshan Piusaabe5752016-09-29 09:03:59 -0700363 status = retrieveWlanInterfaceHandle();
364 if (status != WIFI_SUCCESS || !wlan_interface_handle_) {
365 LOG(ERROR) << "Failed to retrieve wlan interface handle";
366 return status;
367 }
Roshan Pius11f93032016-12-09 10:26:17 -0800368 LOG(DEBUG) << "Legacy HAL start complete";
369 is_started_ = true;
Roshan Piusaabe5752016-09-29 09:03:59 -0700370 return WIFI_SUCCESS;
371}
372
373wifi_error WifiLegacyHal::stop(
Roshan Pius155344b2017-08-11 15:47:42 -0700374 /* NONNULL */ std::unique_lock<std::recursive_mutex>* lock,
Roshan Piusaabe5752016-09-29 09:03:59 -0700375 const std::function<void()>& on_stop_complete_user_callback) {
Roshan Pius11f93032016-12-09 10:26:17 -0800376 if (!is_started_) {
377 LOG(DEBUG) << "Legacy HAL already stopped";
378 on_stop_complete_user_callback();
379 return WIFI_SUCCESS;
380 }
381 LOG(DEBUG) << "Stopping legacy HAL";
Roshan Pius155344b2017-08-11 15:47:42 -0700382 on_stop_complete_internal_callback =
383 [on_stop_complete_user_callback, this](wifi_handle handle) {
Roshan Piusaabe5752016-09-29 09:03:59 -0700384 CHECK_EQ(global_handle_, handle) << "Handle mismatch";
Roshan Pius155344b2017-08-11 15:47:42 -0700385 LOG(INFO) << "Legacy HAL stop complete callback received";
Roshan Pius511cc492016-10-28 09:54:26 -0700386 // Invalidate all the internal pointers now that the HAL is
387 // stopped.
388 invalidate();
Roshan Pius97334112016-11-18 14:07:54 -0800389 iface_tool_.SetWifiUpState(false);
390 on_stop_complete_user_callback();
Roshan Pius155344b2017-08-11 15:47:42 -0700391 is_started_ = false;
Roshan Piusaabe5752016-09-29 09:03:59 -0700392 };
393 awaiting_event_loop_termination_ = true;
Roshan Pius091e1c12017-01-30 16:40:50 -0800394 global_func_table_.wifi_cleanup(global_handle_, onAsyncStopComplete);
Roshan Pius155344b2017-08-11 15:47:42 -0700395 const auto status = stop_wait_cv_.wait_for(
396 *lock, std::chrono::milliseconds(kMaxStopCompleteWaitMs),
397 [this] { return !awaiting_event_loop_termination_; });
398 if (!status) {
399 LOG(ERROR) << "Legacy HAL stop failed or timed out";
400 return WIFI_ERROR_UNKNOWN;
401 }
Roshan Pius11f93032016-12-09 10:26:17 -0800402 LOG(DEBUG) << "Legacy HAL stop complete";
Roshan Piusaabe5752016-09-29 09:03:59 -0700403 return WIFI_SUCCESS;
404}
405
Roshan Piusab5c4712016-10-06 14:37:15 -0700406std::pair<wifi_error, std::string> WifiLegacyHal::getDriverVersion() {
Roshan Pius4b26c832016-10-03 12:49:58 -0700407 std::array<char, kMaxVersionStringLength> buffer;
408 buffer.fill(0);
409 wifi_error status = global_func_table_.wifi_get_driver_version(
410 wlan_interface_handle_, buffer.data(), buffer.size());
Roshan Pius0a47c182016-10-28 10:23:00 -0700411 return {status, buffer.data()};
Roshan Pius4b26c832016-10-03 12:49:58 -0700412}
413
Roshan Piusab5c4712016-10-06 14:37:15 -0700414std::pair<wifi_error, std::string> WifiLegacyHal::getFirmwareVersion() {
Roshan Pius4b26c832016-10-03 12:49:58 -0700415 std::array<char, kMaxVersionStringLength> buffer;
416 buffer.fill(0);
417 wifi_error status = global_func_table_.wifi_get_firmware_version(
418 wlan_interface_handle_, buffer.data(), buffer.size());
Roshan Pius0a47c182016-10-28 10:23:00 -0700419 return {status, buffer.data()};
Roshan Pius4b26c832016-10-03 12:49:58 -0700420}
421
Roshan Pius3c868522016-10-27 12:43:49 -0700422std::pair<wifi_error, std::vector<uint8_t>>
Roshan Piusab5c4712016-10-06 14:37:15 -0700423WifiLegacyHal::requestDriverMemoryDump() {
Roshan Pius3c868522016-10-27 12:43:49 -0700424 std::vector<uint8_t> driver_dump;
Roshan Piuscdb77f32016-10-03 14:09:57 -0700425 on_driver_memory_dump_internal_callback = [&driver_dump](char* buffer,
426 int buffer_size) {
Roshan Pius3c868522016-10-27 12:43:49 -0700427 driver_dump.insert(driver_dump.end(),
428 reinterpret_cast<uint8_t*>(buffer),
429 reinterpret_cast<uint8_t*>(buffer) + buffer_size);
Roshan Piuscdb77f32016-10-03 14:09:57 -0700430 };
431 wifi_error status = global_func_table_.wifi_get_driver_memory_dump(
Roshan Pius091e1c12017-01-30 16:40:50 -0800432 wlan_interface_handle_, {onSyncDriverMemoryDump});
Roshan Piuscdb77f32016-10-03 14:09:57 -0700433 on_driver_memory_dump_internal_callback = nullptr;
Roshan Pius0a47c182016-10-28 10:23:00 -0700434 return {status, std::move(driver_dump)};
Roshan Piuscdb77f32016-10-03 14:09:57 -0700435}
436
Roshan Pius3c868522016-10-27 12:43:49 -0700437std::pair<wifi_error, std::vector<uint8_t>>
Roshan Piusab5c4712016-10-06 14:37:15 -0700438WifiLegacyHal::requestFirmwareMemoryDump() {
Roshan Pius3c868522016-10-27 12:43:49 -0700439 std::vector<uint8_t> firmware_dump;
Roshan Piuscdb77f32016-10-03 14:09:57 -0700440 on_firmware_memory_dump_internal_callback = [&firmware_dump](
441 char* buffer, int buffer_size) {
Roshan Pius3c868522016-10-27 12:43:49 -0700442 firmware_dump.insert(firmware_dump.end(),
443 reinterpret_cast<uint8_t*>(buffer),
444 reinterpret_cast<uint8_t*>(buffer) + buffer_size);
Roshan Piuscdb77f32016-10-03 14:09:57 -0700445 };
446 wifi_error status = global_func_table_.wifi_get_firmware_memory_dump(
Roshan Pius091e1c12017-01-30 16:40:50 -0800447 wlan_interface_handle_, {onSyncFirmwareMemoryDump});
Roshan Piuscdb77f32016-10-03 14:09:57 -0700448 on_firmware_memory_dump_internal_callback = nullptr;
Roshan Pius0a47c182016-10-28 10:23:00 -0700449 return {status, std::move(firmware_dump)};
450}
451
452std::pair<wifi_error, uint32_t> WifiLegacyHal::getSupportedFeatureSet() {
453 feature_set set;
454 static_assert(sizeof(set) == sizeof(uint32_t),
455 "Some features can not be represented in output");
456 wifi_error status = global_func_table_.wifi_get_supported_feature_set(
457 wlan_interface_handle_, &set);
458 return {status, static_cast<uint32_t>(set)};
459}
460
461std::pair<wifi_error, PacketFilterCapabilities>
462WifiLegacyHal::getPacketFilterCapabilities() {
463 PacketFilterCapabilities caps;
464 wifi_error status = global_func_table_.wifi_get_packet_filter_capabilities(
465 wlan_interface_handle_, &caps.version, &caps.max_len);
466 return {status, caps};
467}
468
469wifi_error WifiLegacyHal::setPacketFilter(const std::vector<uint8_t>& program) {
470 return global_func_table_.wifi_set_packet_filter(
471 wlan_interface_handle_, program.data(), program.size());
Roshan Piuscdb77f32016-10-03 14:09:57 -0700472}
473
Roshan Pius76ff3022016-10-28 10:33:34 -0700474std::pair<wifi_error, wifi_gscan_capabilities>
475WifiLegacyHal::getGscanCapabilities() {
476 wifi_gscan_capabilities caps;
477 wifi_error status = global_func_table_.wifi_get_gscan_capabilities(
478 wlan_interface_handle_, &caps);
479 return {status, caps};
480}
481
482wifi_error WifiLegacyHal::startGscan(
483 wifi_request_id id,
484 const wifi_scan_cmd_params& params,
485 const std::function<void(wifi_request_id)>& on_failure_user_callback,
486 const on_gscan_results_callback& on_results_user_callback,
487 const on_gscan_full_result_callback& on_full_result_user_callback) {
488 // If there is already an ongoing background scan, reject new scan requests.
489 if (on_gscan_event_internal_callback ||
490 on_gscan_full_result_internal_callback) {
491 return WIFI_ERROR_NOT_AVAILABLE;
492 }
493
494 // This callback will be used to either trigger |on_results_user_callback| or
495 // |on_failure_user_callback|.
496 on_gscan_event_internal_callback =
497 [on_failure_user_callback, on_results_user_callback, this](
498 wifi_request_id id, wifi_scan_event event) {
499 switch (event) {
500 case WIFI_SCAN_RESULTS_AVAILABLE:
501 case WIFI_SCAN_THRESHOLD_NUM_SCANS:
502 case WIFI_SCAN_THRESHOLD_PERCENT: {
503 wifi_error status;
504 std::vector<wifi_cached_scan_results> cached_scan_results;
505 std::tie(status, cached_scan_results) = getGscanCachedResults();
506 if (status == WIFI_SUCCESS) {
507 on_results_user_callback(id, cached_scan_results);
508 return;
509 }
510 }
511 // Fall through if failed. Failure to retrieve cached scan results
512 // should trigger a background scan failure.
513 case WIFI_SCAN_FAILED:
514 on_failure_user_callback(id);
515 on_gscan_event_internal_callback = nullptr;
516 on_gscan_full_result_internal_callback = nullptr;
517 return;
518 }
519 LOG(FATAL) << "Unexpected gscan event received: " << event;
520 };
521
522 on_gscan_full_result_internal_callback = [on_full_result_user_callback](
523 wifi_request_id id, wifi_scan_result* result, uint32_t buckets_scanned) {
524 if (result) {
525 on_full_result_user_callback(id, result, buckets_scanned);
526 }
527 };
528
Roshan Pius091e1c12017-01-30 16:40:50 -0800529 wifi_scan_result_handler handler = {onAsyncGscanFullResult,
530 onAsyncGscanEvent};
Roshan Pius76ff3022016-10-28 10:33:34 -0700531 wifi_error status = global_func_table_.wifi_start_gscan(
532 id, wlan_interface_handle_, params, handler);
533 if (status != WIFI_SUCCESS) {
534 on_gscan_event_internal_callback = nullptr;
535 on_gscan_full_result_internal_callback = nullptr;
536 }
537 return status;
538}
539
540wifi_error WifiLegacyHal::stopGscan(wifi_request_id id) {
541 // If there is no an ongoing background scan, reject stop requests.
542 // TODO(b/32337212): This needs to be handled by the HIDL object because we
543 // need to return the NOT_STARTED error code.
544 if (!on_gscan_event_internal_callback &&
545 !on_gscan_full_result_internal_callback) {
546 return WIFI_ERROR_NOT_AVAILABLE;
547 }
548 wifi_error status =
549 global_func_table_.wifi_stop_gscan(id, wlan_interface_handle_);
550 // If the request Id is wrong, don't stop the ongoing background scan. Any
551 // other error should be treated as the end of background scan.
552 if (status != WIFI_ERROR_INVALID_REQUEST_ID) {
553 on_gscan_event_internal_callback = nullptr;
554 on_gscan_full_result_internal_callback = nullptr;
555 }
556 return status;
557}
558
559std::pair<wifi_error, std::vector<uint32_t>>
Roshan Pius7f4574d2017-02-22 09:48:03 -0800560WifiLegacyHal::getValidFrequenciesForBand(wifi_band band) {
Roshan Pius76ff3022016-10-28 10:33:34 -0700561 static_assert(sizeof(uint32_t) >= sizeof(wifi_channel),
562 "Wifi Channel cannot be represented in output");
563 std::vector<uint32_t> freqs;
564 freqs.resize(kMaxGscanFrequenciesForBand);
565 int32_t num_freqs = 0;
566 wifi_error status = global_func_table_.wifi_get_valid_channels(
567 wlan_interface_handle_,
568 band,
569 freqs.size(),
570 reinterpret_cast<wifi_channel*>(freqs.data()),
571 &num_freqs);
572 CHECK(num_freqs >= 0 &&
573 static_cast<uint32_t>(num_freqs) <= kMaxGscanFrequenciesForBand);
574 freqs.resize(num_freqs);
575 return {status, std::move(freqs)};
576}
577
Roshan Pius08d1df42017-04-19 23:11:07 -0700578wifi_error WifiLegacyHal::setDfsFlag(bool dfs_on) {
579 return global_func_table_.wifi_set_nodfs_flag(
580 wlan_interface_handle_, dfs_on ? 0 : 1);
581}
582
Roshan Pius7cece412016-10-28 10:38:21 -0700583wifi_error WifiLegacyHal::enableLinkLayerStats(bool debug) {
584 wifi_link_layer_params params;
585 params.mpdu_size_threshold = kLinkLayerStatsDataMpduSizeThreshold;
586 params.aggressive_statistics_gathering = debug;
587 return global_func_table_.wifi_set_link_stats(wlan_interface_handle_, params);
588}
589
590wifi_error WifiLegacyHal::disableLinkLayerStats() {
591 // TODO: Do we care about these responses?
592 uint32_t clear_mask_rsp;
593 uint8_t stop_rsp;
594 return global_func_table_.wifi_clear_link_stats(
595 wlan_interface_handle_, 0xFFFFFFFF, &clear_mask_rsp, 1, &stop_rsp);
596}
597
598std::pair<wifi_error, LinkLayerStats> WifiLegacyHal::getLinkLayerStats() {
599 LinkLayerStats link_stats{};
600 LinkLayerStats* link_stats_ptr = &link_stats;
601
Roshan Piuse42ace22017-03-13 10:44:20 -0700602 on_link_layer_stats_result_internal_callback =
603 [&link_stats_ptr](wifi_request_id /* id */,
604 wifi_iface_stat* iface_stats_ptr,
605 int num_radios,
606 wifi_radio_stat* radio_stats_ptr) {
607 if (iface_stats_ptr != nullptr) {
608 link_stats_ptr->iface = *iface_stats_ptr;
609 link_stats_ptr->iface.num_peers = 0;
610 } else {
611 LOG(ERROR) << "Invalid iface stats in link layer stats";
612 }
613 if (num_radios <= 0 || radio_stats_ptr == nullptr) {
614 LOG(ERROR) << "Invalid radio stats in link layer stats";
615 return;
616 }
617 for (int i = 0; i < num_radios; i++) {
618 LinkLayerRadioStats radio;
619 radio.stats = radio_stats_ptr[i];
620 // Copy over the tx level array to the separate vector.
621 if (radio_stats_ptr[i].num_tx_levels > 0 &&
622 radio_stats_ptr[i].tx_time_per_levels != nullptr) {
623 radio.tx_time_per_levels.assign(
624 radio_stats_ptr[i].tx_time_per_levels,
625 radio_stats_ptr[i].tx_time_per_levels +
626 radio_stats_ptr[i].num_tx_levels);
627 }
628 radio.stats.num_tx_levels = 0;
629 radio.stats.tx_time_per_levels = nullptr;
630 link_stats_ptr->radios.push_back(radio);
631 }
632 };
Roshan Pius7cece412016-10-28 10:38:21 -0700633
634 wifi_error status = global_func_table_.wifi_get_link_stats(
Roshan Pius091e1c12017-01-30 16:40:50 -0800635 0, wlan_interface_handle_, {onSyncLinkLayerStatsResult});
Roshan Pius7cece412016-10-28 10:38:21 -0700636 on_link_layer_stats_result_internal_callback = nullptr;
637 return {status, link_stats};
638}
639
Roshan Piusd4767542016-12-06 10:04:05 -0800640wifi_error WifiLegacyHal::startRssiMonitoring(
641 wifi_request_id id,
642 int8_t max_rssi,
643 int8_t min_rssi,
644 const on_rssi_threshold_breached_callback&
645 on_threshold_breached_user_callback) {
646 if (on_rssi_threshold_breached_internal_callback) {
647 return WIFI_ERROR_NOT_AVAILABLE;
648 }
649 on_rssi_threshold_breached_internal_callback =
650 [on_threshold_breached_user_callback](
651 wifi_request_id id, uint8_t* bssid_ptr, int8_t rssi) {
652 if (!bssid_ptr) {
653 return;
654 }
655 std::array<uint8_t, 6> bssid_arr;
656 // |bssid_ptr| pointer is assumed to have 6 bytes for the mac address.
657 std::copy(bssid_ptr, bssid_ptr + 6, std::begin(bssid_arr));
658 on_threshold_breached_user_callback(id, bssid_arr, rssi);
659 };
Roshan Pius091e1c12017-01-30 16:40:50 -0800660 wifi_error status = global_func_table_.wifi_start_rssi_monitoring(
661 id,
662 wlan_interface_handle_,
663 max_rssi,
664 min_rssi,
665 {onAsyncRssiThresholdBreached});
Roshan Pius7a41d9d2016-12-06 10:12:59 -0800666 if (status != WIFI_SUCCESS) {
667 on_rssi_threshold_breached_internal_callback = nullptr;
668 }
669 return status;
Roshan Piusd4767542016-12-06 10:04:05 -0800670}
671
672wifi_error WifiLegacyHal::stopRssiMonitoring(wifi_request_id id) {
673 if (!on_rssi_threshold_breached_internal_callback) {
674 return WIFI_ERROR_NOT_AVAILABLE;
675 }
676 wifi_error status =
677 global_func_table_.wifi_stop_rssi_monitoring(id, wlan_interface_handle_);
678 // If the request Id is wrong, don't stop the ongoing rssi monitoring. Any
679 // other error should be treated as the end of background scan.
680 if (status != WIFI_ERROR_INVALID_REQUEST_ID) {
681 on_rssi_threshold_breached_internal_callback = nullptr;
682 }
683 return status;
684}
685
Roshan Pius26801cb2016-12-13 14:25:45 -0800686std::pair<wifi_error, wifi_roaming_capabilities>
687WifiLegacyHal::getRoamingCapabilities() {
688 wifi_roaming_capabilities caps;
689 wifi_error status = global_func_table_.wifi_get_roaming_capabilities(
690 wlan_interface_handle_, &caps);
691 return {status, caps};
692}
693
Roshan Piusaf727c02017-01-11 15:37:25 -0800694wifi_error WifiLegacyHal::configureRoaming(const wifi_roaming_config& config) {
695 wifi_roaming_config config_internal = config;
696 return global_func_table_.wifi_configure_roaming(wlan_interface_handle_,
697 &config_internal);
698}
699
Roshan Pius26801cb2016-12-13 14:25:45 -0800700wifi_error WifiLegacyHal::enableFirmwareRoaming(fw_roaming_state_t state) {
701 return global_func_table_.wifi_enable_firmware_roaming(wlan_interface_handle_,
702 state);
703}
704
Roshan Piusaf727c02017-01-11 15:37:25 -0800705wifi_error WifiLegacyHal::configureNdOffload(bool enable) {
706 return global_func_table_.wifi_configure_nd_offload(wlan_interface_handle_,
707 enable);
Roshan Pius26801cb2016-12-13 14:25:45 -0800708}
709
Roshan Pius9a9869a2017-01-11 16:42:16 -0800710wifi_error WifiLegacyHal::startSendingOffloadedPacket(
711 uint32_t cmd_id,
712 const std::vector<uint8_t>& ip_packet_data,
713 const std::array<uint8_t, 6>& src_address,
714 const std::array<uint8_t, 6>& dst_address,
715 uint32_t period_in_ms) {
716 std::vector<uint8_t> ip_packet_data_internal(ip_packet_data);
717 std::vector<uint8_t> src_address_internal(
718 src_address.data(), src_address.data() + src_address.size());
719 std::vector<uint8_t> dst_address_internal(
720 dst_address.data(), dst_address.data() + dst_address.size());
721 return global_func_table_.wifi_start_sending_offloaded_packet(
722 cmd_id,
723 wlan_interface_handle_,
724 ip_packet_data_internal.data(),
725 ip_packet_data_internal.size(),
726 src_address_internal.data(),
727 dst_address_internal.data(),
728 period_in_ms);
729}
730
731wifi_error WifiLegacyHal::stopSendingOffloadedPacket(uint32_t cmd_id) {
732 return global_func_table_.wifi_stop_sending_offloaded_packet(
733 cmd_id, wlan_interface_handle_);
734}
735
Roshan Pius795bb812017-02-01 13:09:08 -0800736wifi_error WifiLegacyHal::setScanningMacOui(const std::array<uint8_t, 3>& oui) {
737 std::vector<uint8_t> oui_internal(oui.data(), oui.data() + oui.size());
738 return global_func_table_.wifi_set_scanning_mac_oui(wlan_interface_handle_,
739 oui_internal.data());
740}
741
Roshan Pius735ff432017-07-25 08:48:08 -0700742wifi_error WifiLegacyHal::selectTxPowerScenario(wifi_power_scenario scenario) {
743 return global_func_table_.wifi_select_tx_power_scenario(
744 wlan_interface_handle_, scenario);
Roshan Pius8184d212017-07-11 08:59:29 -0700745}
746
Roshan Pius735ff432017-07-25 08:48:08 -0700747wifi_error WifiLegacyHal::resetTxPowerScenario() {
748 return global_func_table_.wifi_reset_tx_power_scenario(wlan_interface_handle_);
Roshan Pius8184d212017-07-11 08:59:29 -0700749}
750
Roshan Pius8714a3e2016-10-28 10:43:51 -0700751std::pair<wifi_error, uint32_t> WifiLegacyHal::getLoggerSupportedFeatureSet() {
752 uint32_t supported_features;
753 wifi_error status = global_func_table_.wifi_get_logger_supported_feature_set(
754 wlan_interface_handle_, &supported_features);
755 return {status, supported_features};
756}
757
758wifi_error WifiLegacyHal::startPktFateMonitoring() {
759 return global_func_table_.wifi_start_pkt_fate_monitoring(
760 wlan_interface_handle_);
761}
762
763std::pair<wifi_error, std::vector<wifi_tx_report>>
764WifiLegacyHal::getTxPktFates() {
765 std::vector<wifi_tx_report> tx_pkt_fates;
766 tx_pkt_fates.resize(MAX_FATE_LOG_LEN);
767 size_t num_fates = 0;
768 wifi_error status =
769 global_func_table_.wifi_get_tx_pkt_fates(wlan_interface_handle_,
770 tx_pkt_fates.data(),
771 tx_pkt_fates.size(),
772 &num_fates);
773 CHECK(num_fates <= MAX_FATE_LOG_LEN);
774 tx_pkt_fates.resize(num_fates);
775 return {status, std::move(tx_pkt_fates)};
776}
777
778std::pair<wifi_error, std::vector<wifi_rx_report>>
779WifiLegacyHal::getRxPktFates() {
780 std::vector<wifi_rx_report> rx_pkt_fates;
781 rx_pkt_fates.resize(MAX_FATE_LOG_LEN);
782 size_t num_fates = 0;
783 wifi_error status =
784 global_func_table_.wifi_get_rx_pkt_fates(wlan_interface_handle_,
785 rx_pkt_fates.data(),
786 rx_pkt_fates.size(),
787 &num_fates);
788 CHECK(num_fates <= MAX_FATE_LOG_LEN);
789 rx_pkt_fates.resize(num_fates);
790 return {status, std::move(rx_pkt_fates)};
791}
792
793std::pair<wifi_error, WakeReasonStats> WifiLegacyHal::getWakeReasonStats() {
794 WakeReasonStats stats;
795 stats.cmd_event_wake_cnt.resize(kMaxWakeReasonStatsArraySize);
796 stats.driver_fw_local_wake_cnt.resize(kMaxWakeReasonStatsArraySize);
797
798 // This legacy struct needs separate memory to store the variable sized wake
799 // reason types.
800 stats.wake_reason_cnt.cmd_event_wake_cnt =
801 reinterpret_cast<int32_t*>(stats.cmd_event_wake_cnt.data());
802 stats.wake_reason_cnt.cmd_event_wake_cnt_sz = stats.cmd_event_wake_cnt.size();
803 stats.wake_reason_cnt.cmd_event_wake_cnt_used = 0;
804 stats.wake_reason_cnt.driver_fw_local_wake_cnt =
805 reinterpret_cast<int32_t*>(stats.driver_fw_local_wake_cnt.data());
806 stats.wake_reason_cnt.driver_fw_local_wake_cnt_sz =
807 stats.driver_fw_local_wake_cnt.size();
808 stats.wake_reason_cnt.driver_fw_local_wake_cnt_used = 0;
809
810 wifi_error status = global_func_table_.wifi_get_wake_reason_stats(
811 wlan_interface_handle_, &stats.wake_reason_cnt);
812
813 CHECK(stats.wake_reason_cnt.cmd_event_wake_cnt_used >= 0 &&
814 static_cast<uint32_t>(stats.wake_reason_cnt.cmd_event_wake_cnt_used) <=
815 kMaxWakeReasonStatsArraySize);
816 stats.cmd_event_wake_cnt.resize(
817 stats.wake_reason_cnt.cmd_event_wake_cnt_used);
818 stats.wake_reason_cnt.cmd_event_wake_cnt = nullptr;
819
820 CHECK(stats.wake_reason_cnt.driver_fw_local_wake_cnt_used >= 0 &&
821 static_cast<uint32_t>(
822 stats.wake_reason_cnt.driver_fw_local_wake_cnt_used) <=
823 kMaxWakeReasonStatsArraySize);
824 stats.driver_fw_local_wake_cnt.resize(
825 stats.wake_reason_cnt.driver_fw_local_wake_cnt_used);
826 stats.wake_reason_cnt.driver_fw_local_wake_cnt = nullptr;
827
828 return {status, stats};
829}
830
831wifi_error WifiLegacyHal::registerRingBufferCallbackHandler(
832 const on_ring_buffer_data_callback& on_user_data_callback) {
833 if (on_ring_buffer_data_internal_callback) {
834 return WIFI_ERROR_NOT_AVAILABLE;
835 }
836 on_ring_buffer_data_internal_callback = [on_user_data_callback](
837 char* ring_name,
838 char* buffer,
839 int buffer_size,
840 wifi_ring_buffer_status* status) {
841 if (status && buffer) {
842 std::vector<uint8_t> buffer_vector(
843 reinterpret_cast<uint8_t*>(buffer),
844 reinterpret_cast<uint8_t*>(buffer) + buffer_size);
845 on_user_data_callback(ring_name, buffer_vector, *status);
846 }
847 };
Roshan Piusadc87cb2016-12-14 18:02:56 -0800848 wifi_error status = global_func_table_.wifi_set_log_handler(
Roshan Pius091e1c12017-01-30 16:40:50 -0800849 0, wlan_interface_handle_, {onAsyncRingBufferData});
Roshan Piusadc87cb2016-12-14 18:02:56 -0800850 if (status != WIFI_SUCCESS) {
851 on_ring_buffer_data_internal_callback = nullptr;
852 }
853 return status;
854}
855
856wifi_error WifiLegacyHal::deregisterRingBufferCallbackHandler() {
857 if (!on_ring_buffer_data_internal_callback) {
858 return WIFI_ERROR_NOT_AVAILABLE;
859 }
860 on_ring_buffer_data_internal_callback = nullptr;
861 return global_func_table_.wifi_reset_log_handler(0, wlan_interface_handle_);
Roshan Pius8714a3e2016-10-28 10:43:51 -0700862}
863
864std::pair<wifi_error, std::vector<wifi_ring_buffer_status>>
865WifiLegacyHal::getRingBuffersStatus() {
866 std::vector<wifi_ring_buffer_status> ring_buffers_status;
867 ring_buffers_status.resize(kMaxRingBuffers);
Roshan Pius48185b22016-12-15 19:10:30 -0800868 uint32_t num_rings = kMaxRingBuffers;
Roshan Pius8714a3e2016-10-28 10:43:51 -0700869 wifi_error status = global_func_table_.wifi_get_ring_buffers_status(
870 wlan_interface_handle_, &num_rings, ring_buffers_status.data());
871 CHECK(num_rings <= kMaxRingBuffers);
872 ring_buffers_status.resize(num_rings);
873 return {status, std::move(ring_buffers_status)};
874}
875
876wifi_error WifiLegacyHal::startRingBufferLogging(const std::string& ring_name,
877 uint32_t verbose_level,
878 uint32_t max_interval_sec,
879 uint32_t min_data_size) {
Roshan Pius8714a3e2016-10-28 10:43:51 -0700880 return global_func_table_.wifi_start_logging(wlan_interface_handle_,
881 verbose_level,
882 0,
883 max_interval_sec,
884 min_data_size,
Roshan Pius32fc12e2017-01-25 17:44:42 -0800885 makeCharVec(ring_name).data());
Roshan Pius8714a3e2016-10-28 10:43:51 -0700886}
887
888wifi_error WifiLegacyHal::getRingBufferData(const std::string& ring_name) {
Roshan Pius8714a3e2016-10-28 10:43:51 -0700889 return global_func_table_.wifi_get_ring_data(wlan_interface_handle_,
Roshan Pius32fc12e2017-01-25 17:44:42 -0800890 makeCharVec(ring_name).data());
Roshan Pius8714a3e2016-10-28 10:43:51 -0700891}
892
Roshan Pius203cb032016-12-14 17:41:20 -0800893wifi_error WifiLegacyHal::registerErrorAlertCallbackHandler(
894 const on_error_alert_callback& on_user_alert_callback) {
895 if (on_error_alert_internal_callback) {
896 return WIFI_ERROR_NOT_AVAILABLE;
897 }
898 on_error_alert_internal_callback = [on_user_alert_callback](
899 wifi_request_id id, char* buffer, int buffer_size, int err_code) {
900 if (buffer) {
901 CHECK(id == 0);
902 on_user_alert_callback(
903 err_code,
904 std::vector<uint8_t>(
905 reinterpret_cast<uint8_t*>(buffer),
906 reinterpret_cast<uint8_t*>(buffer) + buffer_size));
907 }
908 };
909 wifi_error status = global_func_table_.wifi_set_alert_handler(
Roshan Pius091e1c12017-01-30 16:40:50 -0800910 0, wlan_interface_handle_, {onAsyncErrorAlert});
Roshan Pius203cb032016-12-14 17:41:20 -0800911 if (status != WIFI_SUCCESS) {
912 on_error_alert_internal_callback = nullptr;
913 }
914 return status;
915}
916
917wifi_error WifiLegacyHal::deregisterErrorAlertCallbackHandler() {
918 if (!on_error_alert_internal_callback) {
919 return WIFI_ERROR_NOT_AVAILABLE;
920 }
921 on_error_alert_internal_callback = nullptr;
922 return global_func_table_.wifi_reset_alert_handler(0, wlan_interface_handle_);
923}
924
Roshan Piusd8e915a2016-10-28 11:23:11 -0700925wifi_error WifiLegacyHal::startRttRangeRequest(
926 wifi_request_id id,
927 const std::vector<wifi_rtt_config>& rtt_configs,
928 const on_rtt_results_callback& on_results_user_callback) {
929 if (on_rtt_results_internal_callback) {
930 return WIFI_ERROR_NOT_AVAILABLE;
931 }
932
933 on_rtt_results_internal_callback = [on_results_user_callback](
934 wifi_request_id id,
935 unsigned num_results,
936 wifi_rtt_result* rtt_results[]) {
937 if (num_results > 0 && !rtt_results) {
938 LOG(ERROR) << "Unexpected nullptr in RTT results";
939 return;
940 }
941 std::vector<const wifi_rtt_result*> rtt_results_vec;
942 std::copy_if(
943 rtt_results,
944 rtt_results + num_results,
945 back_inserter(rtt_results_vec),
946 [](wifi_rtt_result* rtt_result) { return rtt_result != nullptr; });
947 on_results_user_callback(id, rtt_results_vec);
948 };
949
950 std::vector<wifi_rtt_config> rtt_configs_internal(rtt_configs);
Roshan Pius7a41d9d2016-12-06 10:12:59 -0800951 wifi_error status =
952 global_func_table_.wifi_rtt_range_request(id,
953 wlan_interface_handle_,
954 rtt_configs.size(),
955 rtt_configs_internal.data(),
Roshan Pius091e1c12017-01-30 16:40:50 -0800956 {onAsyncRttResults});
Roshan Pius7a41d9d2016-12-06 10:12:59 -0800957 if (status != WIFI_SUCCESS) {
958 on_rtt_results_internal_callback = nullptr;
959 }
960 return status;
Roshan Piusd8e915a2016-10-28 11:23:11 -0700961}
962
963wifi_error WifiLegacyHal::cancelRttRangeRequest(
964 wifi_request_id id, const std::vector<std::array<uint8_t, 6>>& mac_addrs) {
965 if (!on_rtt_results_internal_callback) {
966 return WIFI_ERROR_NOT_AVAILABLE;
967 }
968 static_assert(sizeof(mac_addr) == sizeof(std::array<uint8_t, 6>),
969 "MAC address size mismatch");
970 // TODO: How do we handle partial cancels (i.e only a subset of enabled mac
971 // addressed are cancelled).
972 std::vector<std::array<uint8_t, 6>> mac_addrs_internal(mac_addrs);
973 wifi_error status = global_func_table_.wifi_rtt_range_cancel(
974 id,
975 wlan_interface_handle_,
976 mac_addrs.size(),
977 reinterpret_cast<mac_addr*>(mac_addrs_internal.data()));
978 // If the request Id is wrong, don't stop the ongoing range request. Any
979 // other error should be treated as the end of rtt ranging.
980 if (status != WIFI_ERROR_INVALID_REQUEST_ID) {
981 on_rtt_results_internal_callback = nullptr;
982 }
983 return status;
984}
985
986std::pair<wifi_error, wifi_rtt_capabilities>
987WifiLegacyHal::getRttCapabilities() {
988 wifi_rtt_capabilities rtt_caps;
989 wifi_error status = global_func_table_.wifi_get_rtt_capabilities(
990 wlan_interface_handle_, &rtt_caps);
991 return {status, rtt_caps};
992}
993
994std::pair<wifi_error, wifi_rtt_responder> WifiLegacyHal::getRttResponderInfo() {
995 wifi_rtt_responder rtt_responder;
996 wifi_error status = global_func_table_.wifi_rtt_get_responder_info(
997 wlan_interface_handle_, &rtt_responder);
998 return {status, rtt_responder};
999}
1000
1001wifi_error WifiLegacyHal::enableRttResponder(
1002 wifi_request_id id,
1003 const wifi_channel_info& channel_hint,
1004 uint32_t max_duration_secs,
1005 const wifi_rtt_responder& info) {
1006 wifi_rtt_responder info_internal(info);
1007 return global_func_table_.wifi_enable_responder(id,
1008 wlan_interface_handle_,
1009 channel_hint,
1010 max_duration_secs,
1011 &info_internal);
1012}
1013
1014wifi_error WifiLegacyHal::disableRttResponder(wifi_request_id id) {
1015 return global_func_table_.wifi_disable_responder(id, wlan_interface_handle_);
1016}
1017
1018wifi_error WifiLegacyHal::setRttLci(wifi_request_id id,
1019 const wifi_lci_information& info) {
1020 wifi_lci_information info_internal(info);
1021 return global_func_table_.wifi_set_lci(
1022 id, wlan_interface_handle_, &info_internal);
1023}
1024
1025wifi_error WifiLegacyHal::setRttLcr(wifi_request_id id,
1026 const wifi_lcr_information& info) {
1027 wifi_lcr_information info_internal(info);
1028 return global_func_table_.wifi_set_lcr(
1029 id, wlan_interface_handle_, &info_internal);
1030}
1031
Roshan Pius23012092016-10-28 11:27:40 -07001032wifi_error WifiLegacyHal::nanRegisterCallbackHandlers(
1033 const NanCallbackHandlers& user_callbacks) {
1034 on_nan_notify_response_user_callback = user_callbacks.on_notify_response;
1035 on_nan_event_publish_terminated_user_callback =
1036 user_callbacks.on_event_publish_terminated;
1037 on_nan_event_match_user_callback = user_callbacks.on_event_match;
1038 on_nan_event_match_expired_user_callback =
1039 user_callbacks.on_event_match_expired;
1040 on_nan_event_subscribe_terminated_user_callback =
1041 user_callbacks.on_event_subscribe_terminated;
1042 on_nan_event_followup_user_callback = user_callbacks.on_event_followup;
1043 on_nan_event_disc_eng_event_user_callback =
1044 user_callbacks.on_event_disc_eng_event;
1045 on_nan_event_disabled_user_callback = user_callbacks.on_event_disabled;
1046 on_nan_event_tca_user_callback = user_callbacks.on_event_tca;
1047 on_nan_event_beacon_sdf_payload_user_callback =
1048 user_callbacks.on_event_beacon_sdf_payload;
1049 on_nan_event_data_path_request_user_callback =
1050 user_callbacks.on_event_data_path_request;
1051 on_nan_event_data_path_confirm_user_callback =
1052 user_callbacks.on_event_data_path_confirm;
1053 on_nan_event_data_path_end_user_callback =
1054 user_callbacks.on_event_data_path_end;
1055 on_nan_event_transmit_follow_up_user_callback =
1056 user_callbacks.on_event_transmit_follow_up;
Etan Cohenc190f932017-02-17 13:06:55 -08001057 on_nan_event_range_request_user_callback =
1058 user_callbacks.on_event_range_request;
1059 on_nan_event_range_report_user_callback =
1060 user_callbacks.on_event_range_report;
Roshan Pius23012092016-10-28 11:27:40 -07001061
1062 return global_func_table_.wifi_nan_register_handler(
1063 wlan_interface_handle_,
Roshan Pius091e1c12017-01-30 16:40:50 -08001064 {onAysncNanNotifyResponse,
Etan Cohen20925b02017-04-04 13:00:14 -07001065 onAysncNanEventPublishReplied,
Roshan Pius091e1c12017-01-30 16:40:50 -08001066 onAysncNanEventPublishTerminated,
1067 onAysncNanEventMatch,
1068 onAysncNanEventMatchExpired,
1069 onAysncNanEventSubscribeTerminated,
1070 onAysncNanEventFollowup,
1071 onAysncNanEventDiscEngEvent,
1072 onAysncNanEventDisabled,
1073 onAysncNanEventTca,
1074 onAysncNanEventBeaconSdfPayload,
1075 onAysncNanEventDataPathRequest,
1076 onAysncNanEventDataPathConfirm,
1077 onAysncNanEventDataPathEnd,
Etan Cohenc190f932017-02-17 13:06:55 -08001078 onAysncNanEventTransmitFollowUp,
1079 onAysncNanEventRangeRequest,
1080 onAysncNanEventRangeReport});
Roshan Pius23012092016-10-28 11:27:40 -07001081}
1082
1083wifi_error WifiLegacyHal::nanEnableRequest(transaction_id id,
1084 const NanEnableRequest& msg) {
1085 NanEnableRequest msg_internal(msg);
1086 return global_func_table_.wifi_nan_enable_request(
1087 id, wlan_interface_handle_, &msg_internal);
1088}
1089
1090wifi_error WifiLegacyHal::nanDisableRequest(transaction_id id) {
1091 return global_func_table_.wifi_nan_disable_request(id,
1092 wlan_interface_handle_);
1093}
1094
1095wifi_error WifiLegacyHal::nanPublishRequest(transaction_id id,
1096 const NanPublishRequest& msg) {
1097 NanPublishRequest msg_internal(msg);
1098 return global_func_table_.wifi_nan_publish_request(
1099 id, wlan_interface_handle_, &msg_internal);
1100}
1101
1102wifi_error WifiLegacyHal::nanPublishCancelRequest(
1103 transaction_id id, const NanPublishCancelRequest& msg) {
1104 NanPublishCancelRequest msg_internal(msg);
1105 return global_func_table_.wifi_nan_publish_cancel_request(
1106 id, wlan_interface_handle_, &msg_internal);
1107}
1108
1109wifi_error WifiLegacyHal::nanSubscribeRequest(transaction_id id,
1110 const NanSubscribeRequest& msg) {
1111 NanSubscribeRequest msg_internal(msg);
1112 return global_func_table_.wifi_nan_subscribe_request(
1113 id, wlan_interface_handle_, &msg_internal);
1114}
1115
1116wifi_error WifiLegacyHal::nanSubscribeCancelRequest(
1117 transaction_id id, const NanSubscribeCancelRequest& msg) {
1118 NanSubscribeCancelRequest msg_internal(msg);
1119 return global_func_table_.wifi_nan_subscribe_cancel_request(
1120 id, wlan_interface_handle_, &msg_internal);
1121}
1122
1123wifi_error WifiLegacyHal::nanTransmitFollowupRequest(
1124 transaction_id id, const NanTransmitFollowupRequest& msg) {
1125 NanTransmitFollowupRequest msg_internal(msg);
1126 return global_func_table_.wifi_nan_transmit_followup_request(
1127 id, wlan_interface_handle_, &msg_internal);
1128}
1129
1130wifi_error WifiLegacyHal::nanStatsRequest(transaction_id id,
1131 const NanStatsRequest& msg) {
1132 NanStatsRequest msg_internal(msg);
1133 return global_func_table_.wifi_nan_stats_request(
1134 id, wlan_interface_handle_, &msg_internal);
1135}
1136
1137wifi_error WifiLegacyHal::nanConfigRequest(transaction_id id,
1138 const NanConfigRequest& msg) {
1139 NanConfigRequest msg_internal(msg);
1140 return global_func_table_.wifi_nan_config_request(
1141 id, wlan_interface_handle_, &msg_internal);
1142}
1143
1144wifi_error WifiLegacyHal::nanTcaRequest(transaction_id id,
1145 const NanTCARequest& msg) {
1146 NanTCARequest msg_internal(msg);
1147 return global_func_table_.wifi_nan_tca_request(
1148 id, wlan_interface_handle_, &msg_internal);
1149}
1150
1151wifi_error WifiLegacyHal::nanBeaconSdfPayloadRequest(
1152 transaction_id id, const NanBeaconSdfPayloadRequest& msg) {
1153 NanBeaconSdfPayloadRequest msg_internal(msg);
1154 return global_func_table_.wifi_nan_beacon_sdf_payload_request(
1155 id, wlan_interface_handle_, &msg_internal);
1156}
1157
1158std::pair<wifi_error, NanVersion> WifiLegacyHal::nanGetVersion() {
1159 NanVersion version;
1160 wifi_error status =
1161 global_func_table_.wifi_nan_get_version(global_handle_, &version);
1162 return {status, version};
1163}
1164
1165wifi_error WifiLegacyHal::nanGetCapabilities(transaction_id id) {
1166 return global_func_table_.wifi_nan_get_capabilities(id,
1167 wlan_interface_handle_);
1168}
1169
1170wifi_error WifiLegacyHal::nanDataInterfaceCreate(
1171 transaction_id id, const std::string& iface_name) {
Roshan Pius23012092016-10-28 11:27:40 -07001172 return global_func_table_.wifi_nan_data_interface_create(
Roshan Pius32fc12e2017-01-25 17:44:42 -08001173 id, wlan_interface_handle_, makeCharVec(iface_name).data());
Roshan Pius23012092016-10-28 11:27:40 -07001174}
1175
1176wifi_error WifiLegacyHal::nanDataInterfaceDelete(
1177 transaction_id id, const std::string& iface_name) {
Roshan Pius23012092016-10-28 11:27:40 -07001178 return global_func_table_.wifi_nan_data_interface_delete(
Roshan Pius32fc12e2017-01-25 17:44:42 -08001179 id, wlan_interface_handle_, makeCharVec(iface_name).data());
Roshan Pius23012092016-10-28 11:27:40 -07001180}
1181
1182wifi_error WifiLegacyHal::nanDataRequestInitiator(
1183 transaction_id id, const NanDataPathInitiatorRequest& msg) {
1184 NanDataPathInitiatorRequest msg_internal(msg);
1185 return global_func_table_.wifi_nan_data_request_initiator(
1186 id, wlan_interface_handle_, &msg_internal);
1187}
1188
1189wifi_error WifiLegacyHal::nanDataIndicationResponse(
1190 transaction_id id, const NanDataPathIndicationResponse& msg) {
1191 NanDataPathIndicationResponse msg_internal(msg);
1192 return global_func_table_.wifi_nan_data_indication_response(
1193 id, wlan_interface_handle_, &msg_internal);
1194}
1195
Etan Cohenc9836f92017-06-30 13:55:21 -07001196typedef struct {
1197 u8 num_ndp_instances;
1198 NanDataPathId ndp_instance_id;
1199} NanDataPathEndSingleNdpIdRequest;
1200
Roshan Pius23012092016-10-28 11:27:40 -07001201wifi_error WifiLegacyHal::nanDataEnd(transaction_id id,
Etan Cohenc9836f92017-06-30 13:55:21 -07001202 uint32_t ndpInstanceId) {
1203 NanDataPathEndSingleNdpIdRequest msg;
1204 msg.num_ndp_instances = 1;
1205 msg.ndp_instance_id = ndpInstanceId;
1206 wifi_error status = global_func_table_.wifi_nan_data_end(
1207 id, wlan_interface_handle_, (NanDataPathEndRequest*)&msg);
1208 return status;
Roshan Pius23012092016-10-28 11:27:40 -07001209}
1210
Roshan Pius32fc12e2017-01-25 17:44:42 -08001211wifi_error WifiLegacyHal::setCountryCode(std::array<int8_t, 2> code) {
1212 std::string code_str(code.data(), code.data() + code.size());
1213 return global_func_table_.wifi_set_country_code(wlan_interface_handle_,
1214 code_str.c_str());
1215}
1216
Roshan Piusaabe5752016-09-29 09:03:59 -07001217wifi_error WifiLegacyHal::retrieveWlanInterfaceHandle() {
Roshan Piusab5c4712016-10-06 14:37:15 -07001218 const std::string& ifname_to_find = getStaIfaceName();
Roshan Piusaabe5752016-09-29 09:03:59 -07001219 wifi_interface_handle* iface_handles = nullptr;
1220 int num_iface_handles = 0;
1221 wifi_error status = global_func_table_.wifi_get_ifaces(
1222 global_handle_, &num_iface_handles, &iface_handles);
1223 if (status != WIFI_SUCCESS) {
Roshan Pius511cc492016-10-28 09:54:26 -07001224 LOG(ERROR) << "Failed to enumerate interface handles";
Roshan Piusaabe5752016-09-29 09:03:59 -07001225 return status;
1226 }
1227 for (int i = 0; i < num_iface_handles; ++i) {
1228 std::array<char, IFNAMSIZ> current_ifname;
1229 current_ifname.fill(0);
1230 status = global_func_table_.wifi_get_iface_name(
1231 iface_handles[i], current_ifname.data(), current_ifname.size());
1232 if (status != WIFI_SUCCESS) {
Roshan Pius511cc492016-10-28 09:54:26 -07001233 LOG(WARNING) << "Failed to get interface handle name";
Roshan Piusaabe5752016-09-29 09:03:59 -07001234 continue;
1235 }
1236 if (ifname_to_find == current_ifname.data()) {
1237 wlan_interface_handle_ = iface_handles[i];
1238 return WIFI_SUCCESS;
1239 }
1240 }
1241 return WIFI_ERROR_UNKNOWN;
1242}
1243
1244void WifiLegacyHal::runEventLoop() {
Roshan Pius11f93032016-12-09 10:26:17 -08001245 LOG(DEBUG) << "Starting legacy HAL event loop";
Roshan Piusaabe5752016-09-29 09:03:59 -07001246 global_func_table_.wifi_event_loop(global_handle_);
Roshan Pius155344b2017-08-11 15:47:42 -07001247 const auto lock = hidl_sync_util::acquireGlobalLock();
Roshan Piusaabe5752016-09-29 09:03:59 -07001248 if (!awaiting_event_loop_termination_) {
1249 LOG(FATAL) << "Legacy HAL event loop terminated, but HAL was not stopping";
1250 }
Roshan Pius11f93032016-12-09 10:26:17 -08001251 LOG(DEBUG) << "Legacy HAL event loop terminated";
Roshan Piusaabe5752016-09-29 09:03:59 -07001252 awaiting_event_loop_termination_ = false;
Roshan Pius155344b2017-08-11 15:47:42 -07001253 stop_wait_cv_.notify_one();
Roshan Piusaabe5752016-09-29 09:03:59 -07001254}
1255
Roshan Pius76ff3022016-10-28 10:33:34 -07001256std::pair<wifi_error, std::vector<wifi_cached_scan_results>>
1257WifiLegacyHal::getGscanCachedResults() {
1258 std::vector<wifi_cached_scan_results> cached_scan_results;
1259 cached_scan_results.resize(kMaxCachedGscanResults);
1260 int32_t num_results = 0;
1261 wifi_error status = global_func_table_.wifi_get_cached_gscan_results(
1262 wlan_interface_handle_,
1263 true /* always flush */,
1264 cached_scan_results.size(),
1265 cached_scan_results.data(),
1266 &num_results);
1267 CHECK(num_results >= 0 &&
1268 static_cast<uint32_t>(num_results) <= kMaxCachedGscanResults);
1269 cached_scan_results.resize(num_results);
1270 // Check for invalid IE lengths in these cached scan results and correct it.
1271 for (auto& cached_scan_result : cached_scan_results) {
1272 int num_scan_results = cached_scan_result.num_results;
1273 for (int i = 0; i < num_scan_results; i++) {
1274 auto& scan_result = cached_scan_result.results[i];
1275 if (scan_result.ie_length > 0) {
Roshan Piusd6ce8262017-08-15 08:42:50 -07001276 LOG(DEBUG) << "Cached scan result has non-zero IE length "
Roshan Pius76ff3022016-10-28 10:33:34 -07001277 << scan_result.ie_length;
1278 scan_result.ie_length = 0;
1279 }
1280 }
1281 }
1282 return {status, std::move(cached_scan_results)};
1283}
1284
Roshan Pius511cc492016-10-28 09:54:26 -07001285void WifiLegacyHal::invalidate() {
1286 global_handle_ = nullptr;
1287 wlan_interface_handle_ = nullptr;
Roshan Pius511cc492016-10-28 09:54:26 -07001288 on_driver_memory_dump_internal_callback = nullptr;
1289 on_firmware_memory_dump_internal_callback = nullptr;
Roshan Pius76ff3022016-10-28 10:33:34 -07001290 on_gscan_event_internal_callback = nullptr;
1291 on_gscan_full_result_internal_callback = nullptr;
Roshan Pius7cece412016-10-28 10:38:21 -07001292 on_link_layer_stats_result_internal_callback = nullptr;
Roshan Piusd4767542016-12-06 10:04:05 -08001293 on_rssi_threshold_breached_internal_callback = nullptr;
Roshan Pius8714a3e2016-10-28 10:43:51 -07001294 on_ring_buffer_data_internal_callback = nullptr;
Roshan Pius203cb032016-12-14 17:41:20 -08001295 on_error_alert_internal_callback = nullptr;
Roshan Piusd8e915a2016-10-28 11:23:11 -07001296 on_rtt_results_internal_callback = nullptr;
Roshan Pius23012092016-10-28 11:27:40 -07001297 on_nan_notify_response_user_callback = nullptr;
1298 on_nan_event_publish_terminated_user_callback = nullptr;
1299 on_nan_event_match_user_callback = nullptr;
1300 on_nan_event_match_expired_user_callback = nullptr;
1301 on_nan_event_subscribe_terminated_user_callback = nullptr;
1302 on_nan_event_followup_user_callback = nullptr;
1303 on_nan_event_disc_eng_event_user_callback = nullptr;
1304 on_nan_event_disabled_user_callback = nullptr;
1305 on_nan_event_tca_user_callback = nullptr;
1306 on_nan_event_beacon_sdf_payload_user_callback = nullptr;
1307 on_nan_event_data_path_request_user_callback = nullptr;
1308 on_nan_event_data_path_confirm_user_callback = nullptr;
1309 on_nan_event_data_path_end_user_callback = nullptr;
1310 on_nan_event_transmit_follow_up_user_callback = nullptr;
Etan Cohenc190f932017-02-17 13:06:55 -08001311 on_nan_event_range_request_user_callback = nullptr;
1312 on_nan_event_range_report_user_callback = nullptr;
Roshan Pius511cc492016-10-28 09:54:26 -07001313}
Roshan Pius955542e2016-10-28 09:42:44 -07001314
1315} // namespace legacy_hal
Roshan Piusaabe5752016-09-29 09:03:59 -07001316} // namespace implementation
Etan Cohen6ce50902017-09-14 07:30:57 -07001317} // namespace V1_2
Roshan Piusaabe5752016-09-29 09:03:59 -07001318} // namespace wifi
1319} // namespace hardware
1320} // namespace android