blob: c353bbc8d1ffe19a0c27de74e1bce83841a81a3a [file] [log] [blame]
Roshan Piuse65edb12016-11-22 13:02:01 -08001/*
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 <android-base/logging.h>
18#include <utils/SystemClock.h>
19
20#include "hidl_struct_util.h"
21
22namespace android {
23namespace hardware {
24namespace wifi {
25namespace V1_0 {
26namespace implementation {
27namespace hidl_struct_util {
28
Roshan Pius32d0ca92016-12-02 11:21:19 -080029uint8_t convertHidlScanReportEventFlagToLegacy(
Roshan Piuse65edb12016-11-22 13:02:01 -080030 StaBackgroundScanBucketEventReportSchemeMask hidl_flag) {
31 using HidlFlag = StaBackgroundScanBucketEventReportSchemeMask;
32 switch (hidl_flag) {
33 case HidlFlag::EACH_SCAN:
34 return REPORT_EVENTS_EACH_SCAN;
35 case HidlFlag::FULL_RESULTS:
36 return REPORT_EVENTS_FULL_RESULTS;
37 case HidlFlag::NO_BATCH:
38 return REPORT_EVENTS_NO_BATCH;
39 };
40}
41
Roshan Pius32d0ca92016-12-02 11:21:19 -080042StaScanDataFlagMask convertLegacyScanDataFlagToHidl(uint8_t legacy_flag) {
43 switch (legacy_flag) {
44 case legacy_hal::WIFI_SCAN_FLAG_INTERRUPTED:
45 return StaScanDataFlagMask::INTERRUPTED;
46 };
47 CHECK(false) << "Unknown legacy flag: " << legacy_flag;
48 // To silence the compiler warning about reaching the end of non-void
49 // function.
Roshan Piusf72df2e2016-12-04 10:49:38 -080050 return {};
51}
52
53IWifiChip::ChipCapabilityMask convertLegacyLoggerFeatureToHidlChipCapability(
54 uint32_t feature) {
55 using HidlChipCaps = IWifiChip::ChipCapabilityMask;
56 switch (feature) {
57 case legacy_hal::WIFI_LOGGER_MEMORY_DUMP_SUPPORTED:
58 return HidlChipCaps::DEBUG_MEMORY_FIRMWARE_DUMP_SUPPORTED;
59 case legacy_hal::WIFI_LOGGER_DRIVER_DUMP_SUPPORTED:
60 return HidlChipCaps::DEBUG_MEMORY_DRIVER_DUMP_SUPPORTED;
61 case legacy_hal::WIFI_LOGGER_CONNECT_EVENT_SUPPORTED:
62 return HidlChipCaps::DEBUG_RING_BUFFER_CONNECT_EVENT_SUPPORTED;
63 case legacy_hal::WIFI_LOGGER_POWER_EVENT_SUPPORTED:
64 return HidlChipCaps::DEBUG_RING_BUFFER_POWER_EVENT_SUPPORTED;
65 case legacy_hal::WIFI_LOGGER_WAKE_LOCK_SUPPORTED:
66 return HidlChipCaps::DEBUG_RING_BUFFER_WAKELOCK_EVENT_SUPPORTED;
67 };
68 CHECK(false) << "Unknown legacy feature: " << feature;
69 return {};
70}
71
72IWifiStaIface::StaIfaceCapabilityMask
73convertLegacyLoggerFeatureToHidlStaIfaceCapability(uint32_t feature) {
74 using HidlStaIfaceCaps = IWifiStaIface::StaIfaceCapabilityMask;
75 switch (feature) {
76 case legacy_hal::WIFI_LOGGER_PACKET_FATE_SUPPORTED:
77 return HidlStaIfaceCaps::DEBUG_PACKET_FATE_SUPPORTED;
78 };
79 CHECK(false) << "Unknown legacy feature: " << feature;
80 return {};
81}
82
83IWifiStaIface::StaIfaceCapabilityMask
84convertLegacyFeatureToHidlStaIfaceCapability(uint32_t feature) {
85 using HidlStaIfaceCaps = IWifiStaIface::StaIfaceCapabilityMask;
86 switch (feature) {
87 case WIFI_FEATURE_GSCAN:
88 return HidlStaIfaceCaps::BACKGROUND_SCAN;
89 case WIFI_FEATURE_LINK_LAYER_STATS:
90 return HidlStaIfaceCaps::LINK_LAYER_STATS;
91 };
92 CHECK(false) << "Unknown legacy feature: " << feature;
93 return {};
94}
95
96bool convertLegacyFeaturesToHidlChipCapabilities(
97 uint32_t legacy_logger_feature_set, uint32_t* hidl_caps) {
98 if (!hidl_caps) {
99 return false;
100 }
101 *hidl_caps = 0;
102 using HidlChipCaps = IWifiChip::ChipCapabilityMask;
103 for (const auto feature : {legacy_hal::WIFI_LOGGER_MEMORY_DUMP_SUPPORTED,
104 legacy_hal::WIFI_LOGGER_DRIVER_DUMP_SUPPORTED,
105 legacy_hal::WIFI_LOGGER_CONNECT_EVENT_SUPPORTED,
106 legacy_hal::WIFI_LOGGER_POWER_EVENT_SUPPORTED,
107 legacy_hal::WIFI_LOGGER_WAKE_LOCK_SUPPORTED}) {
108 if (feature & legacy_logger_feature_set) {
109 *hidl_caps |= convertLegacyLoggerFeatureToHidlChipCapability(feature);
110 }
111 }
112 // There is no flags for these 2 in the legacy feature set. Adding it to the
113 // set because all the current devices support it.
114 *hidl_caps |= HidlChipCaps::DEBUG_RING_BUFFER_VENDOR_DATA_SUPPORTED;
115 *hidl_caps |= HidlChipCaps::DEBUG_HOST_WAKE_REASON_STATS;
116 return true;
117}
118
119WifiDebugRingBufferFlags convertLegacyDebugRingBufferFlagsToHidl(
120 uint32_t flag) {
121 switch (flag) {
122 case WIFI_RING_BUFFER_FLAG_HAS_BINARY_ENTRIES:
123 return WifiDebugRingBufferFlags::HAS_BINARY_ENTRIES;
124 case WIFI_RING_BUFFER_FLAG_HAS_ASCII_ENTRIES:
125 return WifiDebugRingBufferFlags::HAS_ASCII_ENTRIES;
126 };
127 CHECK(false) << "Unknown legacy flag: " << flag;
128 return {};
129}
130
131bool convertLegacyDebugRingBufferStatusToHidl(
132 const legacy_hal::wifi_ring_buffer_status& legacy_status,
133 WifiDebugRingBufferStatus* hidl_status) {
134 if (!hidl_status) {
135 return false;
136 }
137 hidl_status->ringName = reinterpret_cast<const char*>(legacy_status.name);
138 for (const auto flag : {WIFI_RING_BUFFER_FLAG_HAS_BINARY_ENTRIES,
139 WIFI_RING_BUFFER_FLAG_HAS_ASCII_ENTRIES}) {
140 if (flag & legacy_status.flags) {
141 hidl_status->flags |=
142 static_cast<std::underlying_type<WifiDebugRingBufferFlags>::type>(
143 convertLegacyDebugRingBufferFlagsToHidl(flag));
144 }
145 }
146 hidl_status->ringId = legacy_status.ring_id;
147 hidl_status->sizeInBytes = legacy_status.ring_buffer_byte_size;
148 // Calculate free size of the ring the buffer. We don't need to send the
149 // exact read/write pointers that were there in the legacy HAL interface.
150 if (legacy_status.written_bytes >= legacy_status.read_bytes) {
151 hidl_status->freeSizeInBytes =
152 legacy_status.ring_buffer_byte_size -
153 (legacy_status.written_bytes - legacy_status.read_bytes);
154 } else {
155 hidl_status->freeSizeInBytes =
156 legacy_status.read_bytes - legacy_status.written_bytes;
157 }
158 hidl_status->verboseLevel = legacy_status.verbose_level;
159 return true;
160}
161
162bool convertLegacyVectorOfDebugRingBufferStatusToHidl(
163 const std::vector<legacy_hal::wifi_ring_buffer_status>& legacy_status_vec,
164 std::vector<WifiDebugRingBufferStatus>* hidl_status_vec) {
165 if (!hidl_status_vec) {
166 return false;
167 }
168 hidl_status_vec->clear();
169 for (const auto& legacy_status : legacy_status_vec) {
170 WifiDebugRingBufferStatus hidl_status;
171 if (!convertLegacyDebugRingBufferStatusToHidl(legacy_status,
172 &hidl_status)) {
173 return false;
174 }
175 hidl_status_vec->push_back(hidl_status);
176 }
177 return true;
178}
179
180bool convertLegacyWakeReasonStatsToHidl(
181 const legacy_hal::WakeReasonStats& legacy_stats,
182 WifiDebugHostWakeReasonStats* hidl_stats) {
183 if (!hidl_stats) {
184 return false;
185 }
186 hidl_stats->totalCmdEventWakeCnt =
187 legacy_stats.wake_reason_cnt.total_cmd_event_wake;
188 hidl_stats->cmdEventWakeCntPerType = legacy_stats.cmd_event_wake_cnt;
189 hidl_stats->totalDriverFwLocalWakeCnt =
190 legacy_stats.wake_reason_cnt.total_driver_fw_local_wake;
191 hidl_stats->driverFwLocalWakeCntPerType =
192 legacy_stats.driver_fw_local_wake_cnt;
193 hidl_stats->totalRxPacketWakeCnt =
194 legacy_stats.wake_reason_cnt.total_rx_data_wake;
195 hidl_stats->rxPktWakeDetails.rxUnicastCnt =
196 legacy_stats.wake_reason_cnt.rx_wake_details.rx_unicast_cnt;
197 hidl_stats->rxPktWakeDetails.rxMulticastCnt =
198 legacy_stats.wake_reason_cnt.rx_wake_details.rx_multicast_cnt;
199 hidl_stats->rxPktWakeDetails.rxBroadcastCnt =
200 legacy_stats.wake_reason_cnt.rx_wake_details.rx_broadcast_cnt;
201 hidl_stats->rxMulticastPkWakeDetails.ipv4RxMulticastAddrCnt =
202 legacy_stats.wake_reason_cnt.rx_multicast_wake_pkt_info
203 .ipv4_rx_multicast_addr_cnt;
204 hidl_stats->rxMulticastPkWakeDetails.ipv6RxMulticastAddrCnt =
205 legacy_stats.wake_reason_cnt.rx_multicast_wake_pkt_info
206 .ipv6_rx_multicast_addr_cnt;
207 hidl_stats->rxMulticastPkWakeDetails.otherRxMulticastAddrCnt =
208 legacy_stats.wake_reason_cnt.rx_multicast_wake_pkt_info
209 .other_rx_multicast_addr_cnt;
210 hidl_stats->rxIcmpPkWakeDetails.icmpPkt =
211 legacy_stats.wake_reason_cnt.rx_wake_pkt_classification_info.icmp_pkt;
212 hidl_stats->rxIcmpPkWakeDetails.icmp6Pkt =
213 legacy_stats.wake_reason_cnt.rx_wake_pkt_classification_info.icmp6_pkt;
214 hidl_stats->rxIcmpPkWakeDetails.icmp6Ra =
215 legacy_stats.wake_reason_cnt.rx_wake_pkt_classification_info.icmp6_ra;
216 hidl_stats->rxIcmpPkWakeDetails.icmp6Na =
217 legacy_stats.wake_reason_cnt.rx_wake_pkt_classification_info.icmp6_na;
218 hidl_stats->rxIcmpPkWakeDetails.icmp6Ns =
219 legacy_stats.wake_reason_cnt.rx_wake_pkt_classification_info.icmp6_ns;
220 return true;
221}
222
223bool convertLegacyFeaturesToHidlStaCapabilities(
224 uint32_t legacy_feature_set,
225 uint32_t legacy_logger_feature_set,
226 uint32_t* hidl_caps) {
227 if (!hidl_caps) {
228 return false;
229 }
230 *hidl_caps = 0;
231 using HidlStaIfaceCaps = IWifiStaIface::StaIfaceCapabilityMask;
232 for (const auto feature : {legacy_hal::WIFI_LOGGER_PACKET_FATE_SUPPORTED}) {
233 if (feature & legacy_logger_feature_set) {
234 *hidl_caps |= convertLegacyLoggerFeatureToHidlStaIfaceCapability(feature);
235 }
236 }
237 for (const auto feature :
238 {WIFI_FEATURE_GSCAN, WIFI_FEATURE_LINK_LAYER_STATS}) {
239 if (feature & legacy_feature_set) {
240 *hidl_caps |= convertLegacyFeatureToHidlStaIfaceCapability(feature);
241 }
242 }
243 // There is no flag for this one in the legacy feature set. Adding it to the
244 // set because all the current devices support it.
245 *hidl_caps |= HidlStaIfaceCaps::APF;
246 return true;
247}
248
249bool convertLegacyApfCapabilitiesToHidl(
250 const legacy_hal::PacketFilterCapabilities& legacy_caps,
251 StaApfPacketFilterCapabilities* hidl_caps) {
252 if (!hidl_caps) {
253 return false;
254 }
255 hidl_caps->version = legacy_caps.version;
256 hidl_caps->maxLength = legacy_caps.max_len;
257 return true;
258}
259
260bool convertLegacyScanCapabilitiesToHidl(
261 const legacy_hal::wifi_gscan_capabilities& legacy_caps,
262 StaBackgroundScanCapabilities* hidl_caps) {
263 if (!hidl_caps) {
264 return false;
265 }
266 hidl_caps->maxCacheSize = legacy_caps.max_scan_cache_size;
267 hidl_caps->maxBuckets = legacy_caps.max_scan_buckets;
268 hidl_caps->maxApCachePerScan = legacy_caps.max_ap_cache_per_scan;
269 hidl_caps->maxReportingThreshold = legacy_caps.max_scan_reporting_threshold;
270 return true;
Roshan Pius32d0ca92016-12-02 11:21:19 -0800271}
272
Roshan Piuse65edb12016-11-22 13:02:01 -0800273bool convertHidlScanParamsToLegacy(
274 const StaBackgroundScanParameters& hidl_scan_params,
275 legacy_hal::wifi_scan_cmd_params* legacy_scan_params) {
276 if (!legacy_scan_params) {
277 return false;
278 }
279 legacy_scan_params->base_period = hidl_scan_params.basePeriodInMs;
280 legacy_scan_params->max_ap_per_scan = hidl_scan_params.maxApPerScan;
281 legacy_scan_params->report_threshold_percent =
282 hidl_scan_params.reportThresholdPercent;
283 legacy_scan_params->report_threshold_num_scans =
284 hidl_scan_params.reportThresholdNumScans;
285 // TODO(b/33194311): Expose these max limits in the HIDL interface.
286 if (hidl_scan_params.buckets.size() > MAX_BUCKETS) {
287 return false;
288 }
289 legacy_scan_params->num_buckets = hidl_scan_params.buckets.size();
290 for (uint32_t bucket_idx = 0; bucket_idx < hidl_scan_params.buckets.size();
291 bucket_idx++) {
292 const StaBackgroundScanBucketParameters& hidl_bucket_spec =
293 hidl_scan_params.buckets[bucket_idx];
294 legacy_hal::wifi_scan_bucket_spec& legacy_bucket_spec =
295 legacy_scan_params->buckets[bucket_idx];
296 legacy_bucket_spec.bucket = bucket_idx;
297 legacy_bucket_spec.band =
298 static_cast<legacy_hal::wifi_band>(hidl_bucket_spec.band);
299 legacy_bucket_spec.period = hidl_bucket_spec.periodInMs;
300 legacy_bucket_spec.max_period = hidl_bucket_spec.exponentialMaxPeriodInMs;
301 legacy_bucket_spec.base = hidl_bucket_spec.exponentialBase;
302 legacy_bucket_spec.step_count = hidl_bucket_spec.exponentialStepCount;
303 legacy_bucket_spec.report_events = 0;
304 using HidlFlag = StaBackgroundScanBucketEventReportSchemeMask;
305 for (const auto flag :
306 {HidlFlag::EACH_SCAN, HidlFlag::FULL_RESULTS, HidlFlag::NO_BATCH}) {
307 if (hidl_bucket_spec.eventReportScheme &
308 static_cast<std::underlying_type<HidlFlag>::type>(flag)) {
309 legacy_bucket_spec.report_events |=
Roshan Pius32d0ca92016-12-02 11:21:19 -0800310 convertHidlScanReportEventFlagToLegacy(flag);
Roshan Piuse65edb12016-11-22 13:02:01 -0800311 }
312 }
313 // TODO(b/33194311): Expose these max limits in the HIDL interface.
314 if (hidl_bucket_spec.frequencies.size() > MAX_CHANNELS) {
315 return false;
316 }
317 legacy_bucket_spec.num_channels = hidl_bucket_spec.frequencies.size();
318 for (uint32_t freq_idx = 0; freq_idx < hidl_bucket_spec.frequencies.size();
319 freq_idx++) {
320 legacy_bucket_spec.channels[freq_idx].channel =
321 hidl_bucket_spec.frequencies[freq_idx];
322 }
323 }
324 return true;
325}
326
Roshan Pius3fae9c82016-12-02 14:49:41 -0800327bool convertLegacyIeToHidl(
328 const legacy_hal::wifi_information_element& legacy_ie,
329 WifiInformationElement* hidl_ie) {
330 if (!hidl_ie) {
331 return false;
332 }
333 hidl_ie->id = legacy_ie.id;
334 hidl_ie->data =
335 std::vector<uint8_t>(legacy_ie.data, legacy_ie.data + legacy_ie.len);
336 return true;
337}
338
Roshan Piuse65edb12016-11-22 13:02:01 -0800339bool convertLegacyIeBlobToHidl(const uint8_t* ie_blob,
340 uint32_t ie_blob_len,
341 std::vector<WifiInformationElement>* hidl_ies) {
342 if (!ie_blob || !hidl_ies) {
343 return false;
344 }
345 const uint8_t* ies_begin = ie_blob;
346 const uint8_t* ies_end = ie_blob + ie_blob_len;
347 const uint8_t* next_ie = ies_begin;
348 using wifi_ie = legacy_hal::wifi_information_element;
349 constexpr size_t kIeHeaderLen = sizeof(wifi_ie);
350 // Each IE should atleast have the header (i.e |id| & |len| fields).
351 while (next_ie + kIeHeaderLen <= ies_end) {
352 const wifi_ie& legacy_ie = (*reinterpret_cast<const wifi_ie*>(next_ie));
353 uint32_t curr_ie_len = kIeHeaderLen + legacy_ie.len;
354 if (next_ie + curr_ie_len > ies_end) {
355 return false;
356 }
357 WifiInformationElement hidl_ie;
Roshan Pius3fae9c82016-12-02 14:49:41 -0800358 if (!convertLegacyIeToHidl(legacy_ie, &hidl_ie)) {
359 return false;
360 }
Roshan Piuse65edb12016-11-22 13:02:01 -0800361 hidl_ies->push_back(std::move(hidl_ie));
362 next_ie += curr_ie_len;
363 }
364 // Ensure that the blob has been fully consumed.
365 return (next_ie == ies_end);
366}
367
368bool convertLegacyScanResultToHidl(
369 const legacy_hal::wifi_scan_result& legacy_scan_result,
370 bool has_ie_data,
371 StaScanResult* hidl_scan_result) {
372 if (!hidl_scan_result) {
373 return false;
374 }
375 hidl_scan_result->timeStampInUs = legacy_scan_result.ts;
376 hidl_scan_result->ssid = std::vector<uint8_t>(
377 legacy_scan_result.ssid,
378 legacy_scan_result.ssid + sizeof(legacy_scan_result.ssid));
379 memcpy(hidl_scan_result->bssid.data(),
380 legacy_scan_result.bssid,
381 hidl_scan_result->bssid.size());
382 hidl_scan_result->frequency = legacy_scan_result.channel;
383 hidl_scan_result->rssi = legacy_scan_result.rssi;
384 hidl_scan_result->beaconPeriodInMs = legacy_scan_result.beacon_period;
385 hidl_scan_result->capability = legacy_scan_result.capability;
386 if (has_ie_data) {
387 std::vector<WifiInformationElement> ies;
388 if (!convertLegacyIeBlobToHidl(
389 reinterpret_cast<const uint8_t*>(legacy_scan_result.ie_data),
390 legacy_scan_result.ie_length,
391 &ies)) {
392 return false;
393 }
394 hidl_scan_result->informationElements = std::move(ies);
395 }
396 return true;
397}
398
399bool convertLegacyCachedScanResultsToHidl(
400 const legacy_hal::wifi_cached_scan_results& legacy_cached_scan_result,
401 StaScanData* hidl_scan_data) {
402 if (!hidl_scan_data) {
403 return false;
404 }
Roshan Pius32d0ca92016-12-02 11:21:19 -0800405 for (const auto flag : {legacy_hal::WIFI_SCAN_FLAG_INTERRUPTED}) {
406 if (legacy_cached_scan_result.flags & flag) {
407 hidl_scan_data->flags |=
408 static_cast<std::underlying_type<StaScanDataFlagMask>::type>(
409 convertLegacyScanDataFlagToHidl(flag));
410 }
411 }
Roshan Piuse65edb12016-11-22 13:02:01 -0800412 hidl_scan_data->bucketsScanned = legacy_cached_scan_result.buckets_scanned;
413
414 CHECK(legacy_cached_scan_result.num_results >= 0 &&
415 legacy_cached_scan_result.num_results <= MAX_AP_CACHE_PER_SCAN);
416 std::vector<StaScanResult> hidl_scan_results;
417 for (int32_t result_idx = 0;
418 result_idx < legacy_cached_scan_result.num_results;
419 result_idx++) {
420 StaScanResult hidl_scan_result;
421 if (!convertLegacyScanResultToHidl(
422 legacy_cached_scan_result.results[result_idx],
423 false,
424 &hidl_scan_result)) {
425 return false;
426 }
427 hidl_scan_results.push_back(hidl_scan_result);
428 }
429 hidl_scan_data->results = std::move(hidl_scan_results);
430 return true;
431}
432
433bool convertLegacyVectorOfCachedScanResultsToHidl(
434 const std::vector<legacy_hal::wifi_cached_scan_results>&
435 legacy_cached_scan_results,
436 std::vector<StaScanData>* hidl_scan_datas) {
437 if (!hidl_scan_datas) {
438 return false;
439 }
440 for (const auto& legacy_cached_scan_result : legacy_cached_scan_results) {
441 StaScanData hidl_scan_data;
442 if (!convertLegacyCachedScanResultsToHidl(legacy_cached_scan_result,
443 &hidl_scan_data)) {
444 return false;
445 }
446 hidl_scan_datas->push_back(hidl_scan_data);
447 }
448 return true;
449}
450
Roshan Pius32d0ca92016-12-02 11:21:19 -0800451WifiDebugTxPacketFate convertLegacyDebugTxPacketFateToHidl(
452 legacy_hal::wifi_tx_packet_fate fate) {
453 switch (fate) {
454 case legacy_hal::TX_PKT_FATE_ACKED:
455 return WifiDebugTxPacketFate::ACKED;
456 case legacy_hal::TX_PKT_FATE_SENT:
457 return WifiDebugTxPacketFate::SENT;
458 case legacy_hal::TX_PKT_FATE_FW_QUEUED:
459 return WifiDebugTxPacketFate::FW_QUEUED;
460 case legacy_hal::TX_PKT_FATE_FW_DROP_INVALID:
461 return WifiDebugTxPacketFate::FW_DROP_INVALID;
462 case legacy_hal::TX_PKT_FATE_FW_DROP_NOBUFS:
463 return WifiDebugTxPacketFate::FW_DROP_NOBUFS;
464 case legacy_hal::TX_PKT_FATE_FW_DROP_OTHER:
465 return WifiDebugTxPacketFate::FW_DROP_OTHER;
466 case legacy_hal::TX_PKT_FATE_DRV_QUEUED:
467 return WifiDebugTxPacketFate::DRV_QUEUED;
468 case legacy_hal::TX_PKT_FATE_DRV_DROP_INVALID:
469 return WifiDebugTxPacketFate::DRV_DROP_INVALID;
470 case legacy_hal::TX_PKT_FATE_DRV_DROP_NOBUFS:
471 return WifiDebugTxPacketFate::DRV_DROP_NOBUFS;
472 case legacy_hal::TX_PKT_FATE_DRV_DROP_OTHER:
473 return WifiDebugTxPacketFate::DRV_DROP_OTHER;
474 };
Roshan Pius3fae9c82016-12-02 14:49:41 -0800475 CHECK(false) << "Unknown legacy fate type: " << fate;
Roshan Pius32d0ca92016-12-02 11:21:19 -0800476}
477
478WifiDebugRxPacketFate convertLegacyDebugRxPacketFateToHidl(
479 legacy_hal::wifi_rx_packet_fate fate) {
480 switch (fate) {
481 case legacy_hal::RX_PKT_FATE_SUCCESS:
482 return WifiDebugRxPacketFate::SUCCESS;
483 case legacy_hal::RX_PKT_FATE_FW_QUEUED:
484 return WifiDebugRxPacketFate::FW_QUEUED;
485 case legacy_hal::RX_PKT_FATE_FW_DROP_FILTER:
486 return WifiDebugRxPacketFate::FW_DROP_FILTER;
487 case legacy_hal::RX_PKT_FATE_FW_DROP_INVALID:
488 return WifiDebugRxPacketFate::FW_DROP_INVALID;
489 case legacy_hal::RX_PKT_FATE_FW_DROP_NOBUFS:
490 return WifiDebugRxPacketFate::FW_DROP_NOBUFS;
491 case legacy_hal::RX_PKT_FATE_FW_DROP_OTHER:
492 return WifiDebugRxPacketFate::FW_DROP_OTHER;
493 case legacy_hal::RX_PKT_FATE_DRV_QUEUED:
494 return WifiDebugRxPacketFate::DRV_QUEUED;
495 case legacy_hal::RX_PKT_FATE_DRV_DROP_FILTER:
496 return WifiDebugRxPacketFate::DRV_DROP_FILTER;
497 case legacy_hal::RX_PKT_FATE_DRV_DROP_INVALID:
498 return WifiDebugRxPacketFate::DRV_DROP_INVALID;
499 case legacy_hal::RX_PKT_FATE_DRV_DROP_NOBUFS:
500 return WifiDebugRxPacketFate::DRV_DROP_NOBUFS;
501 case legacy_hal::RX_PKT_FATE_DRV_DROP_OTHER:
502 return WifiDebugRxPacketFate::DRV_DROP_OTHER;
503 };
Roshan Pius3fae9c82016-12-02 14:49:41 -0800504 CHECK(false) << "Unknown legacy fate type: " << fate;
Roshan Pius32d0ca92016-12-02 11:21:19 -0800505}
506
507WifiDebugPacketFateFrameType convertLegacyDebugPacketFateFrameTypeToHidl(
508 legacy_hal::frame_type type) {
509 switch (type) {
510 case legacy_hal::FRAME_TYPE_UNKNOWN:
511 return WifiDebugPacketFateFrameType::UNKNOWN;
512 case legacy_hal::FRAME_TYPE_ETHERNET_II:
513 return WifiDebugPacketFateFrameType::ETHERNET_II;
514 case legacy_hal::FRAME_TYPE_80211_MGMT:
515 return WifiDebugPacketFateFrameType::MGMT_80211;
516 };
Roshan Pius3fae9c82016-12-02 14:49:41 -0800517 CHECK(false) << "Unknown legacy frame type: " << type;
Roshan Pius32d0ca92016-12-02 11:21:19 -0800518}
519
520bool convertLegacyDebugPacketFateFrameToHidl(
521 const legacy_hal::frame_info& legacy_frame,
522 WifiDebugPacketFateFrameInfo* hidl_frame) {
523 if (!hidl_frame) {
524 return false;
525 }
526 hidl_frame->frameType =
527 convertLegacyDebugPacketFateFrameTypeToHidl(legacy_frame.payload_type);
528 hidl_frame->frameLen = legacy_frame.frame_len;
529 hidl_frame->driverTimestampUsec = legacy_frame.driver_timestamp_usec;
530 hidl_frame->firmwareTimestampUsec = legacy_frame.firmware_timestamp_usec;
531 const uint8_t* frame_begin = reinterpret_cast<const uint8_t*>(
532 legacy_frame.frame_content.ethernet_ii_bytes);
533 hidl_frame->frameContent =
534 std::vector<uint8_t>(frame_begin, frame_begin + legacy_frame.frame_len);
535 return true;
536}
537
538bool convertLegacyDebugTxPacketFateToHidl(
539 const legacy_hal::wifi_tx_report& legacy_fate,
540 WifiDebugTxPacketFateReport* hidl_fate) {
541 if (!hidl_fate) {
542 return false;
543 }
544 hidl_fate->fate = convertLegacyDebugTxPacketFateToHidl(legacy_fate.fate);
545 return convertLegacyDebugPacketFateFrameToHidl(legacy_fate.frame_inf,
546 &hidl_fate->frameInfo);
547}
548
Roshan Piusf72df2e2016-12-04 10:49:38 -0800549bool convertLegacyVectorOfDebugTxPacketFateToHidl(
550 const std::vector<legacy_hal::wifi_tx_report>& legacy_fates,
551 std::vector<WifiDebugTxPacketFateReport>* hidl_fates) {
552 if (!hidl_fates) {
553 return false;
554 }
555 hidl_fates->clear();
556 for (const auto& legacy_fate : legacy_fates) {
557 WifiDebugTxPacketFateReport hidl_fate;
558 if (!convertLegacyDebugTxPacketFateToHidl(legacy_fate, &hidl_fate)) {
559 return false;
560 }
561 hidl_fates->push_back(hidl_fate);
562 }
563 return true;
564}
565
Roshan Pius32d0ca92016-12-02 11:21:19 -0800566bool convertLegacyDebugRxPacketFateToHidl(
567 const legacy_hal::wifi_rx_report& legacy_fate,
568 WifiDebugRxPacketFateReport* hidl_fate) {
569 if (!hidl_fate) {
570 return false;
571 }
572 hidl_fate->fate = convertLegacyDebugRxPacketFateToHidl(legacy_fate.fate);
573 return convertLegacyDebugPacketFateFrameToHidl(legacy_fate.frame_inf,
574 &hidl_fate->frameInfo);
575}
576
Roshan Piusf72df2e2016-12-04 10:49:38 -0800577bool convertLegacyVectorOfDebugRxPacketFateToHidl(
578 const std::vector<legacy_hal::wifi_rx_report>& legacy_fates,
579 std::vector<WifiDebugRxPacketFateReport>* hidl_fates) {
580 if (!hidl_fates) {
581 return false;
582 }
583 hidl_fates->clear();
584 for (const auto& legacy_fate : legacy_fates) {
585 WifiDebugRxPacketFateReport hidl_fate;
586 if (!convertLegacyDebugRxPacketFateToHidl(legacy_fate, &hidl_fate)) {
587 return false;
588 }
589 hidl_fates->push_back(hidl_fate);
590 }
591 return true;
592}
593
Roshan Piuse65edb12016-11-22 13:02:01 -0800594bool convertLegacyLinkLayerStatsToHidl(
595 const legacy_hal::LinkLayerStats& legacy_stats,
596 StaLinkLayerStats* hidl_stats) {
597 if (!hidl_stats) {
598 return false;
599 }
600 // iface legacy_stats conversion.
601 hidl_stats->iface.beaconRx = legacy_stats.iface.beacon_rx;
602 hidl_stats->iface.avgRssiMgmt = legacy_stats.iface.rssi_mgmt;
603 hidl_stats->iface.wmeBePktStats.rxMpdu =
604 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].rx_mpdu;
605 hidl_stats->iface.wmeBePktStats.txMpdu =
606 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].tx_mpdu;
607 hidl_stats->iface.wmeBePktStats.lostMpdu =
608 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].mpdu_lost;
609 hidl_stats->iface.wmeBePktStats.retries =
610 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].retries;
611 hidl_stats->iface.wmeBkPktStats.rxMpdu =
612 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].rx_mpdu;
613 hidl_stats->iface.wmeBkPktStats.txMpdu =
614 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].tx_mpdu;
615 hidl_stats->iface.wmeBkPktStats.lostMpdu =
616 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].mpdu_lost;
617 hidl_stats->iface.wmeBkPktStats.retries =
618 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].retries;
619 hidl_stats->iface.wmeViPktStats.rxMpdu =
620 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].rx_mpdu;
621 hidl_stats->iface.wmeViPktStats.txMpdu =
622 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].tx_mpdu;
623 hidl_stats->iface.wmeViPktStats.lostMpdu =
624 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].mpdu_lost;
625 hidl_stats->iface.wmeViPktStats.retries =
626 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].retries;
627 hidl_stats->iface.wmeVoPktStats.rxMpdu =
628 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].rx_mpdu;
629 hidl_stats->iface.wmeVoPktStats.txMpdu =
630 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].tx_mpdu;
631 hidl_stats->iface.wmeVoPktStats.lostMpdu =
632 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].mpdu_lost;
633 hidl_stats->iface.wmeVoPktStats.retries =
634 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].retries;
635 // radio legacy_stats conversion.
636 hidl_stats->radio.onTimeInMs = legacy_stats.radio.on_time;
637 hidl_stats->radio.txTimeInMs = legacy_stats.radio.tx_time;
638 hidl_stats->radio.rxTimeInMs = legacy_stats.radio.rx_time;
639 hidl_stats->radio.onTimeInMsForScan = legacy_stats.radio.on_time_scan;
640 hidl_stats->radio.txTimeInMsPerLevel = legacy_stats.radio_tx_time_per_levels;
641 // Timestamp in the HAL wrapper here since it's not provided in the legacy
642 // HAL API.
643 hidl_stats->timeStampInMs = uptimeMillis();
644 return true;
645}
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800646
647legacy_hal::NanPublishType convertHidlNanPublishTypeToLegacy(
648 NanPublishType type) {
649 switch (type) {
650 case NanPublishType::UNSOLICITED:
651 return legacy_hal::NAN_PUBLISH_TYPE_UNSOLICITED;
652 case NanPublishType::SOLICITED:
653 return legacy_hal::NAN_PUBLISH_TYPE_SOLICITED;
654 case NanPublishType::UNSOLICITED_SOLICITED:
655 return legacy_hal::NAN_PUBLISH_TYPE_UNSOLICITED_SOLICITED;
656 };
Roshan Pius3fae9c82016-12-02 14:49:41 -0800657 CHECK(false);
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800658}
659
660legacy_hal::NanTxType convertHidlNanTxTypeToLegacy(NanTxType type) {
661 switch (type) {
662 case NanTxType::BROADCAST:
663 return legacy_hal::NAN_TX_TYPE_BROADCAST;
664 case NanTxType::UNICAST:
665 return legacy_hal::NAN_TX_TYPE_UNICAST;
666 };
Roshan Pius3fae9c82016-12-02 14:49:41 -0800667 CHECK(false);
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800668}
669
670legacy_hal::NanMatchAlg convertHidlNanMatchAlgToLegacy(NanMatchAlg type) {
671 switch (type) {
672 case NanMatchAlg::MATCH_ONCE:
673 return legacy_hal::NAN_MATCH_ALG_MATCH_ONCE;
674 case NanMatchAlg::MATCH_CONTINUOUS:
675 return legacy_hal::NAN_MATCH_ALG_MATCH_CONTINUOUS;
676 case NanMatchAlg::MATCH_NEVER:
677 return legacy_hal::NAN_MATCH_ALG_MATCH_NEVER;
678 };
Roshan Pius3fae9c82016-12-02 14:49:41 -0800679 CHECK(false);
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800680}
681
682legacy_hal::NanSubscribeType convertHidlNanSubscribeTypeToLegacy(
683 NanSubscribeType type) {
684 switch (type) {
685 case NanSubscribeType::ACTIVE:
686 return legacy_hal::NAN_SUBSCRIBE_TYPE_ACTIVE;
687 case NanSubscribeType::PASSIVE:
688 return legacy_hal::NAN_SUBSCRIBE_TYPE_PASSIVE;
689 };
Roshan Pius3fae9c82016-12-02 14:49:41 -0800690 CHECK(false);
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800691}
692
693legacy_hal::NanSRFType convertHidlNanSrfTypeToLegacy(NanSrfType type) {
694 switch (type) {
695 case NanSrfType::BLOOM_FILTER:
696 return legacy_hal::NAN_SRF_ATTR_BLOOM_FILTER;
697 case NanSrfType::PARTIAL_MAC_ADDR:
698 return legacy_hal::NAN_SRF_ATTR_PARTIAL_MAC_ADDR;
699 };
Roshan Pius3fae9c82016-12-02 14:49:41 -0800700 CHECK(false);
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800701}
702
703legacy_hal::NanSRFIncludeType convertHidlNanSrfIncludeTypeToLegacy(
704 NanSrfIncludeType type) {
705 switch (type) {
706 case NanSrfIncludeType::DO_NOT_RESPOND:
707 return legacy_hal::NAN_SRF_INCLUDE_DO_NOT_RESPOND;
708 case NanSrfIncludeType::RESPOND:
709 return legacy_hal::NAN_SRF_INCLUDE_RESPOND;
710 };
Roshan Pius3fae9c82016-12-02 14:49:41 -0800711 CHECK(false);
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800712}
713
714NanStatusType convertLegacyNanStatusTypeToHidl(
715 legacy_hal::NanStatusType /* type */) {
716 // TODO: The |NanStatusType| has changed in legacy HAL and no longer in sync
717 // with the HIDL interface.
718 return NanStatusType::SUCCESS;
719}
720
721NanResponseType convertLegacyNanResponseTypeToHidl(
722 legacy_hal::NanResponseType type) {
723 switch (type) {
724 case legacy_hal::NAN_RESPONSE_ENABLED:
725 return NanResponseType::ENABLED;
726 case legacy_hal::NAN_RESPONSE_DISABLED:
727 return NanResponseType::DISABLED;
728 case legacy_hal::NAN_RESPONSE_PUBLISH:
729 return NanResponseType::PUBLISH;
730 case legacy_hal::NAN_RESPONSE_PUBLISH_CANCEL:
731 return NanResponseType::PUBLISH_CANCEL;
732 case legacy_hal::NAN_RESPONSE_TRANSMIT_FOLLOWUP:
733 return NanResponseType::TRANSMIT_FOLLOWUP;
734 case legacy_hal::NAN_RESPONSE_SUBSCRIBE:
735 return NanResponseType::SUBSCRIBE;
736 case legacy_hal::NAN_RESPONSE_SUBSCRIBE_CANCEL:
737 return NanResponseType::SUBSCRIBE_CANCEL;
738 case legacy_hal::NAN_RESPONSE_STATS:
739 // Not present in HIDL. Is going to be deprecated in legacy HAL as well.
740 CHECK(0);
741 case legacy_hal::NAN_RESPONSE_CONFIG:
742 return NanResponseType::CONFIG;
743 case legacy_hal::NAN_RESPONSE_TCA:
744 // Not present in HIDL. Is going to be deprecated in legacy HAL as well.
745 CHECK(0);
746 case legacy_hal::NAN_RESPONSE_ERROR:
747 return NanResponseType::ERROR;
748 case legacy_hal::NAN_RESPONSE_BEACON_SDF_PAYLOAD:
749 return NanResponseType::BEACON_SDF_PAYLOAD;
750 case legacy_hal::NAN_GET_CAPABILITIES:
751 return NanResponseType::GET_CAPABILITIES;
752 case legacy_hal::NAN_DP_INTERFACE_CREATE:
753 return NanResponseType::DP_INTERFACE_CREATE;
754 case legacy_hal::NAN_DP_INTERFACE_DELETE:
755 return NanResponseType::DP_INTERFACE_DELETE;
756 case legacy_hal::NAN_DP_INITIATOR_RESPONSE:
757 return NanResponseType::DP_INITIATOR_RESPONSE;
758 case legacy_hal::NAN_DP_RESPONDER_RESPONSE:
759 return NanResponseType::DP_RESPONDER_RESPONSE;
760 case legacy_hal::NAN_DP_END:
761 return NanResponseType::DP_END;
762 };
Roshan Pius3fae9c82016-12-02 14:49:41 -0800763 CHECK(false) << "Unknown legacy type: " << type;
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800764}
765
766bool convertHidlNanEnableRequestToLegacy(
767 const NanEnableRequest& hidl_request,
768 legacy_hal::NanEnableRequest* legacy_request) {
769 if (!legacy_request) {
770 return false;
771 }
772 legacy_request->master_pref = hidl_request.masterPref;
773 legacy_request->cluster_low = hidl_request.clusterLow;
774 legacy_request->cluster_high = hidl_request.clusterHigh;
775 legacy_request->config_support_5g = hidl_request.validSupport5gVal;
776 legacy_request->support_5g_val = hidl_request.support5gVal;
777 legacy_request->config_sid_beacon = hidl_request.validSidBeaconVal;
778 legacy_request->sid_beacon_val = hidl_request.sidBeaconVal;
779 legacy_request->config_2dot4g_rssi_close =
780 hidl_request.valid2dot4gRssiCloseVal;
781 legacy_request->rssi_close_2dot4g_val = hidl_request.rssiClose2dot4gVal;
782 legacy_request->config_2dot4g_rssi_middle =
783 hidl_request.valid2dot4gRssiMiddleVal;
784 legacy_request->rssi_middle_2dot4g_val = hidl_request.rssiMiddle2dot4gVal;
785 legacy_request->config_2dot4g_rssi_proximity =
786 hidl_request.valid2dot4gRssiProximityVal;
787 legacy_request->rssi_proximity_2dot4g_val =
788 hidl_request.rssiProximity2dot4gVal;
789 legacy_request->config_hop_count_limit = hidl_request.validHopCountLimitVal;
790 legacy_request->hop_count_limit_val = hidl_request.hopCountLimitVal;
791 legacy_request->config_2dot4g_support = hidl_request.valid2dot4gSupportVal;
792 legacy_request->support_2dot4g_val = hidl_request.support2dot4gVal;
793 legacy_request->config_2dot4g_beacons = hidl_request.valid2dot4gBeaconsVal;
794 legacy_request->beacon_2dot4g_val = hidl_request.beacon2dot4gVal;
795 legacy_request->config_2dot4g_sdf = hidl_request.valid2dot4gSdfVal;
796 legacy_request->sdf_2dot4g_val = hidl_request.sdf2dot4gVal;
797 legacy_request->config_5g_beacons = hidl_request.valid5gBeaconsVal;
798 legacy_request->beacon_5g_val = hidl_request.beacon5gVal;
799 legacy_request->config_5g_sdf = hidl_request.valid5gSdfVal;
800 legacy_request->sdf_5g_val = hidl_request.sdf5gVal;
801 legacy_request->config_5g_rssi_close = hidl_request.valid5gRssiCloseVal;
802 legacy_request->rssi_close_5g_val = hidl_request.rssiClose5gVal;
803 legacy_request->config_5g_rssi_middle = hidl_request.valid5gRssiMiddleVal;
804 legacy_request->rssi_middle_5g_val = hidl_request.rssiMiddle5gVal;
805 legacy_request->config_5g_rssi_close_proximity =
806 hidl_request.valid5gRssiCloseProximityVal;
807 legacy_request->rssi_close_proximity_5g_val =
808 hidl_request.rssiCloseProximity5gVal;
809 legacy_request->config_rssi_window_size = hidl_request.validRssiWindowSizeVal;
810 legacy_request->rssi_window_size_val = hidl_request.rssiWindowSizeVal;
811 legacy_request->config_oui = hidl_request.validOuiVal;
812 legacy_request->oui_val = hidl_request.ouiVal;
813 legacy_request->config_intf_addr = hidl_request.validIntfAddrVal;
814 CHECK(hidl_request.intfAddrVal.size() ==
815 sizeof(legacy_request->intf_addr_val));
816 memcpy(legacy_request->intf_addr_val,
817 hidl_request.intfAddrVal.data(),
818 hidl_request.intfAddrVal.size());
819 legacy_request->config_cluster_attribute_val =
820 hidl_request.configClusterAttributeVal;
821 legacy_request->config_scan_params = hidl_request.validScanParamsVal;
822 if (hidl_request.scanParamsVal.dwellTime.size() >
823 sizeof(legacy_request->scan_params_val.dwell_time)) {
824 return false;
825 }
826 memcpy(legacy_request->scan_params_val.dwell_time,
827 hidl_request.scanParamsVal.dwellTime.data(),
828 hidl_request.scanParamsVal.dwellTime.size());
829 if (hidl_request.scanParamsVal.scanPeriod.size() >
830 sizeof(legacy_request->scan_params_val.scan_period)) {
831 return false;
832 }
833 memcpy(legacy_request->scan_params_val.scan_period,
834 hidl_request.scanParamsVal.scanPeriod.data(),
835 hidl_request.scanParamsVal.scanPeriod.size());
836 legacy_request->config_random_factor_force =
837 hidl_request.validRandomFactorForceVal;
838 legacy_request->random_factor_force_val = hidl_request.randomFactorForceVal;
839 legacy_request->config_hop_count_force = hidl_request.validHopCountLimitVal;
840 legacy_request->hop_count_force_val = hidl_request.hopCountLimitVal;
841 legacy_request->config_24g_channel = hidl_request.valid24gChannelVal;
842 legacy_request->channel_24g_val = hidl_request.channel24gVal;
843 legacy_request->config_5g_channel = hidl_request.valid5gChannelVal;
844 legacy_request->channel_5g_val = hidl_request.channel5gVal;
845 return true;
846}
847
848bool convertHidlNanPublishRequestToLegacy(
849 const NanPublishRequest& hidl_request,
850 legacy_hal::NanPublishRequest* legacy_request) {
851 if (!legacy_request) {
852 return false;
853 }
854 legacy_request->publish_id = hidl_request.publishId;
855 legacy_request->ttl = hidl_request.ttl;
856 legacy_request->period = hidl_request.period;
857 legacy_request->publish_type =
858 convertHidlNanPublishTypeToLegacy(hidl_request.publishType);
859 legacy_request->tx_type = convertHidlNanTxTypeToLegacy(hidl_request.txType);
860 legacy_request->publish_count = hidl_request.publishCount;
861 if (hidl_request.serviceName.size() > sizeof(legacy_request->service_name)) {
862 return false;
863 }
864 legacy_request->service_name_len = hidl_request.serviceName.size();
865 memcpy(legacy_request->service_name,
866 hidl_request.serviceName.c_str(),
867 hidl_request.serviceName.size());
868 legacy_request->publish_match_indicator =
869 convertHidlNanMatchAlgToLegacy(hidl_request.publishMatchIndicator);
870 if (hidl_request.serviceSpecificInfo.size() >
871 sizeof(legacy_request->service_specific_info)) {
872 return false;
873 }
874 legacy_request->service_specific_info_len =
875 hidl_request.serviceSpecificInfo.size();
876 memcpy(legacy_request->service_specific_info,
877 hidl_request.serviceSpecificInfo.data(),
878 hidl_request.serviceSpecificInfo.size());
879 if (hidl_request.rxMatchFilter.size() >
880 sizeof(legacy_request->rx_match_filter)) {
881 return false;
882 }
883 legacy_request->rx_match_filter_len = hidl_request.rxMatchFilter.size();
884 memcpy(legacy_request->rx_match_filter,
885 hidl_request.rxMatchFilter.data(),
886 hidl_request.rxMatchFilter.size());
887 if (hidl_request.txMatchFilter.size() >
888 sizeof(legacy_request->tx_match_filter)) {
889 return false;
890 }
891 legacy_request->tx_match_filter_len = hidl_request.txMatchFilter.size();
892 memcpy(legacy_request->tx_match_filter,
893 hidl_request.txMatchFilter.data(),
894 hidl_request.txMatchFilter.size());
895 legacy_request->rssi_threshold_flag = hidl_request.useRssiThreshold;
896 legacy_request->connmap = hidl_request.connmap;
897 legacy_request->recv_indication_cfg = hidl_request.recvIndicationCfg;
898 return true;
899}
900
901bool convertHidlNanPublishCancelRequestToLegacy(
902 const NanPublishCancelRequest& hidl_request,
903 legacy_hal::NanPublishCancelRequest* legacy_request) {
904 legacy_request->publish_id = hidl_request.publishId;
905 return true;
906}
907
908bool convertHidlNanSubscribeRequestToLegacy(
909 const NanSubscribeRequest& hidl_request,
910 legacy_hal::NanSubscribeRequest* legacy_request) {
911 if (!legacy_request) {
912 return false;
913 }
914 legacy_request->subscribe_id = hidl_request.subscribeId;
915 legacy_request->ttl = hidl_request.ttl;
916 legacy_request->period = hidl_request.period;
917 legacy_request->subscribe_type =
918 convertHidlNanSubscribeTypeToLegacy(hidl_request.subscribeType);
919 legacy_request->serviceResponseFilter =
920 convertHidlNanSrfTypeToLegacy(hidl_request.serviceResponseFilter);
921 legacy_request->serviceResponseInclude =
922 convertHidlNanSrfIncludeTypeToLegacy(hidl_request.serviceResponseInclude);
923 legacy_request->useServiceResponseFilter =
924 hidl_request.shouldUseServiceResponseFilter
925 ? legacy_hal::NAN_USE_SRF
926 : legacy_hal::NAN_DO_NOT_USE_SRF;
927 legacy_request->ssiRequiredForMatchIndication =
928 hidl_request.isSsiRequiredForMatchIndication
929 ? legacy_hal::NAN_SSI_REQUIRED_IN_MATCH_IND
930 : legacy_hal::NAN_SSI_NOT_REQUIRED_IN_MATCH_IND;
931 legacy_request->subscribe_match_indicator =
932 convertHidlNanMatchAlgToLegacy(hidl_request.subscribeMatchIndicator);
933 legacy_request->subscribe_count = hidl_request.subscribeCount;
934 if (hidl_request.serviceName.size() > sizeof(legacy_request->service_name)) {
935 return false;
936 }
937 legacy_request->service_name_len = hidl_request.serviceName.size();
938 memcpy(legacy_request->service_name,
939 hidl_request.serviceName.c_str(),
940 hidl_request.serviceName.size());
941 if (hidl_request.serviceSpecificInfo.size() >
942 sizeof(legacy_request->service_specific_info)) {
943 return false;
944 }
945 legacy_request->service_specific_info_len =
946 hidl_request.serviceSpecificInfo.size();
947 memcpy(legacy_request->service_specific_info,
948 hidl_request.serviceSpecificInfo.data(),
949 hidl_request.serviceSpecificInfo.size());
950 if (hidl_request.rxMatchFilter.size() >
951 sizeof(legacy_request->rx_match_filter)) {
952 return false;
953 }
954 legacy_request->rx_match_filter_len = hidl_request.rxMatchFilter.size();
955 memcpy(legacy_request->rx_match_filter,
956 hidl_request.rxMatchFilter.data(),
957 hidl_request.rxMatchFilter.size());
958 if (hidl_request.txMatchFilter.size() >
959 sizeof(legacy_request->tx_match_filter)) {
960 return false;
961 }
962 legacy_request->tx_match_filter_len = hidl_request.txMatchFilter.size();
963 memcpy(legacy_request->tx_match_filter,
964 hidl_request.txMatchFilter.data(),
965 hidl_request.txMatchFilter.size());
966 legacy_request->rssi_threshold_flag = hidl_request.useRssiThreshold;
967 legacy_request->connmap = hidl_request.connmap;
968 if (hidl_request.intfAddr.size() > NAN_MAX_SUBSCRIBE_MAX_ADDRESS) {
969 return false;
970 }
971 legacy_request->num_intf_addr_present = hidl_request.intfAddr.size();
972 for (uint32_t i = 0; i < hidl_request.intfAddr.size(); i++) {
973 CHECK(hidl_request.intfAddr[i].size() ==
974 sizeof(legacy_request->intf_addr[i]));
975 memcpy(legacy_request->intf_addr[i],
976 hidl_request.intfAddr[i].data(),
977 hidl_request.intfAddr[i].size());
978 }
979 legacy_request->recv_indication_cfg = hidl_request.recvIndicationCfg;
980 return true;
981}
982
983bool convertHidlNanSubscribeCancelRequestToLegacy(
984 const NanSubscribeCancelRequest& /* hidl_request */,
985 legacy_hal::NanSubscribeCancelRequest* /* legacy_request */) {
986 return false;
987}
988
989bool convertHidlNanTransmitFollowupRequestToLegacy(
990 const NanTransmitFollowupRequest& /* hidl_request */,
991 legacy_hal::NanTransmitFollowupRequest* /* legacy_request */) {
992 return false;
993}
994
995bool convertHidlNanConfigRequestToLegacy(
996 const NanConfigRequest& /* hidl_request */,
997 legacy_hal::NanConfigRequest* /* legacy_request */) {
998 return false;
999}
1000
1001bool convertHidlNanBeaconSdfPayloadRequestToLegacy(
1002 const NanBeaconSdfPayloadRequest& /* hidl_request */,
1003 legacy_hal::NanBeaconSdfPayloadRequest* /* legacy_request */) {
1004 return false;
1005}
1006
1007bool convertHidlNanDataPathInitiatorRequestToLegacy(
1008 const NanDataPathInitiatorRequest& /* hidl_request */,
1009 legacy_hal::NanDataPathInitiatorRequest* /* legacy_request */) {
1010 return false;
1011}
1012
1013bool convertHidlNanDataPathIndicationResponseToLegacy(
1014 const NanDataPathIndicationResponse& /* hidl_response */,
1015 legacy_hal::NanDataPathIndicationResponse* /* legacy_response */) {
1016 return false;
1017}
1018
1019bool convertHidlNanDataPathEndRequestToLegacy(
1020 const NanDataPathEndRequest& /* hidl_request */,
1021 legacy_hal::NanDataPathEndRequest* /* legacy_request */) {
1022 return false;
1023}
1024
1025bool convertLegacyNanResponseHeaderToHidl(
1026 const legacy_hal::NanResponseMsg& legacy_response,
1027 NanResponseMsgHeader* hidl_response) {
1028 if (!hidl_response) {
1029 return false;
1030 }
1031 hidl_response->status =
1032 convertLegacyNanStatusTypeToHidl(legacy_response.status);
1033 hidl_response->value = legacy_response.value;
1034 hidl_response->responseType =
1035 convertLegacyNanResponseTypeToHidl(legacy_response.response_type);
1036 return true;
1037}
1038
1039bool convertLegacyNanPublishResponseToHidl(
1040 const legacy_hal::NanPublishResponse& /* legacy_response */,
1041 NanPublishResponse* /* hidl_response */) {
1042 return false;
1043}
1044
1045bool convertLegacyNanSubscribeResponseToHidl(
1046 const legacy_hal::NanSubscribeResponse& /* legacy_response */,
1047 NanSubscribeResponse* /* hidl_response */) {
1048 return false;
1049}
1050
1051bool convertLegacyNanDataPathResponseToHidl(
1052 const legacy_hal::NanDataPathRequestResponse& /* legacy_response */,
1053 NanDataPathResponse* /* hidl_response */) {
1054 return false;
1055}
1056
1057bool convertLegacyNanCapabilitiesResponseToHidl(
1058 const legacy_hal::NanCapabilities& /* legacy_response */,
1059 NanCapabilitiesResponse* /* hidl_response */) {
1060 return false;
1061}
1062
1063bool convertLegacyNanPublishTerminatedIndToHidl(
1064 const legacy_hal::NanPublishTerminatedInd& /* legacy_ind */,
1065 NanPublishTerminatedInd* /* hidl_ind */) {
1066 return false;
1067}
1068
1069bool convertLegacyNanMatchIndToHidl(
1070 const legacy_hal::NanMatchInd& /* legacy_ind */,
1071 NanMatchInd* /* hidl_ind */) {
1072 return false;
1073}
1074
1075bool convertLegacyNanMatchExpiredIndToHidl(
1076 const legacy_hal::NanMatchExpiredInd& /* legacy_ind */,
1077 NanMatchExpiredInd* /* hidl_ind */) {
1078 return false;
1079}
1080
1081bool convertLegacyNanSubscribeTerminatedIndToHidl(
1082 const legacy_hal::NanSubscribeTerminatedInd& /* legacy_ind */,
1083 NanSubscribeTerminatedInd* /* hidl_ind */) {
1084 return false;
1085}
1086
1087bool convertLegacyNanFollowupIndToHidl(
1088 const legacy_hal::NanFollowupInd& /* legacy_ind */,
1089 NanFollowupInd* /* hidl_ind */) {
1090 return false;
1091}
1092
1093bool convertLegacyNanDiscEngEventIndToHidl(
1094 const legacy_hal::NanDiscEngEventInd& /* legacy_ind */,
1095 NanDiscEngEventInd* /* hidl_ind */) {
1096 return false;
1097}
1098
1099bool convertLegacyNanDisabledIndToHidl(
1100 const legacy_hal::NanDisabledInd& /* legacy_ind */,
1101 NanDisabledInd* /* hidl_ind */) {
1102 return false;
1103}
1104
1105bool convertLegacyNanBeaconSdfPayloadIndToHidl(
1106 const legacy_hal::NanBeaconSdfPayloadInd& /* legacy_ind */,
1107 NanBeaconSdfPayloadInd* /* hidl_ind */) {
1108 return false;
1109}
1110
1111bool convertLegacyNanDataPathRequestIndToHidl(
1112 const legacy_hal::NanDataPathRequestInd& /* legacy_ind */,
1113 NanDataPathRequestInd* /* hidl_ind */) {
1114 return false;
1115}
1116
1117bool convertLegacyNanDataPathConfirmIndToHidl(
1118 const legacy_hal::NanDataPathConfirmInd& /* legacy_ind */,
1119 NanDataPathConfirmInd* /* hidl_ind */) {
1120 return false;
1121}
1122
1123bool convertLegacyNanDataPathEndIndToHidl(
1124 const legacy_hal::NanDataPathEndInd& /* legacy_ind */,
1125 NanDataPathEndInd* /* hidl_ind */) {
1126 return false;
1127}
1128
1129bool convertLegacyNanTransmitFollowupIndToHidl(
1130 const legacy_hal::NanTransmitFollowupInd& /* legacy_ind */,
1131 NanTransmitFollowupInd* /* hidl_ind */) {
1132 return false;
1133}
Roshan Pius3fae9c82016-12-02 14:49:41 -08001134
1135legacy_hal::wifi_rtt_type convertHidlRttTypeToLegacy(RttType type) {
1136 switch (type) {
1137 case RttType::ONE_SIDED:
1138 return legacy_hal::RTT_TYPE_1_SIDED;
1139 case RttType::TWO_SIDED:
1140 return legacy_hal::RTT_TYPE_2_SIDED;
1141 };
1142 CHECK(false);
1143}
1144
1145RttType convertLegacyRttTypeToHidl(legacy_hal::wifi_rtt_type type) {
1146 switch (type) {
1147 case legacy_hal::RTT_TYPE_1_SIDED:
1148 return RttType::ONE_SIDED;
1149 case legacy_hal::RTT_TYPE_2_SIDED:
1150 return RttType::TWO_SIDED;
1151 };
1152 CHECK(false) << "Unknown legacy type: " << type;
1153}
1154
1155legacy_hal::rtt_peer_type convertHidlRttPeerTypeToLegacy(RttPeerType type) {
1156 switch (type) {
1157 case RttPeerType::AP:
1158 return legacy_hal::RTT_PEER_AP;
1159 case RttPeerType::STA:
1160 return legacy_hal::RTT_PEER_STA;
1161 case RttPeerType::P2P_GO:
1162 return legacy_hal::RTT_PEER_P2P_GO;
1163 case RttPeerType::P2P_CLIENT:
1164 return legacy_hal::RTT_PEER_P2P_CLIENT;
1165 case RttPeerType::NAN:
1166 return legacy_hal::RTT_PEER_NAN;
1167 };
1168 CHECK(false);
1169}
1170
1171legacy_hal::wifi_channel_width convertHidlWifiChannelWidthToLegacy(
1172 WifiChannelWidthInMhz type) {
1173 switch (type) {
1174 case WifiChannelWidthInMhz::WIDTH_20:
1175 return legacy_hal::WIFI_CHAN_WIDTH_20;
1176 case WifiChannelWidthInMhz::WIDTH_40:
1177 return legacy_hal::WIFI_CHAN_WIDTH_40;
1178 case WifiChannelWidthInMhz::WIDTH_80:
1179 return legacy_hal::WIFI_CHAN_WIDTH_80;
1180 case WifiChannelWidthInMhz::WIDTH_160:
1181 return legacy_hal::WIFI_CHAN_WIDTH_160;
1182 case WifiChannelWidthInMhz::WIDTH_80P80:
1183 return legacy_hal::WIFI_CHAN_WIDTH_80P80;
1184 case WifiChannelWidthInMhz::WIDTH_5:
1185 return legacy_hal::WIFI_CHAN_WIDTH_5;
1186 case WifiChannelWidthInMhz::WIDTH_10:
1187 return legacy_hal::WIFI_CHAN_WIDTH_10;
1188 case WifiChannelWidthInMhz::WIDTH_INVALID:
1189 return legacy_hal::WIFI_CHAN_WIDTH_INVALID;
1190 };
1191 CHECK(false);
1192}
1193
1194WifiChannelWidthInMhz convertLegacyWifiChannelWidthToHidl(
1195 legacy_hal::wifi_channel_width type) {
1196 switch (type) {
1197 case legacy_hal::WIFI_CHAN_WIDTH_20:
1198 return WifiChannelWidthInMhz::WIDTH_20;
1199 case legacy_hal::WIFI_CHAN_WIDTH_40:
1200 return WifiChannelWidthInMhz::WIDTH_40;
1201 case legacy_hal::WIFI_CHAN_WIDTH_80:
1202 return WifiChannelWidthInMhz::WIDTH_80;
1203 case legacy_hal::WIFI_CHAN_WIDTH_160:
1204 return WifiChannelWidthInMhz::WIDTH_160;
1205 case legacy_hal::WIFI_CHAN_WIDTH_80P80:
1206 return WifiChannelWidthInMhz::WIDTH_80P80;
1207 case legacy_hal::WIFI_CHAN_WIDTH_5:
1208 return WifiChannelWidthInMhz::WIDTH_5;
1209 case legacy_hal::WIFI_CHAN_WIDTH_10:
1210 return WifiChannelWidthInMhz::WIDTH_10;
1211 case legacy_hal::WIFI_CHAN_WIDTH_INVALID:
1212 return WifiChannelWidthInMhz::WIDTH_INVALID;
1213 };
1214 CHECK(false) << "Unknown legacy type: " << type;
1215}
1216
1217legacy_hal::wifi_rtt_preamble convertHidlRttPreambleToLegacy(RttPreamble type) {
1218 switch (type) {
1219 case RttPreamble::LEGACY:
1220 return legacy_hal::WIFI_RTT_PREAMBLE_LEGACY;
1221 case RttPreamble::HT:
1222 return legacy_hal::WIFI_RTT_PREAMBLE_HT;
1223 case RttPreamble::VHT:
1224 return legacy_hal::WIFI_RTT_PREAMBLE_VHT;
1225 };
1226 CHECK(false);
1227}
1228
1229RttPreamble convertLegacyRttPreambleToHidl(legacy_hal::wifi_rtt_preamble type) {
1230 switch (type) {
1231 case legacy_hal::WIFI_RTT_PREAMBLE_LEGACY:
1232 return RttPreamble::LEGACY;
1233 case legacy_hal::WIFI_RTT_PREAMBLE_HT:
1234 return RttPreamble::HT;
1235 case legacy_hal::WIFI_RTT_PREAMBLE_VHT:
1236 return RttPreamble::VHT;
1237 };
1238 CHECK(false) << "Unknown legacy type: " << type;
1239}
1240
1241legacy_hal::wifi_rtt_bw convertHidlRttBwToLegacy(RttBw type) {
1242 switch (type) {
1243 case RttBw::BW_5MHZ:
1244 return legacy_hal::WIFI_RTT_BW_5;
1245 case RttBw::BW_10MHZ:
1246 return legacy_hal::WIFI_RTT_BW_10;
1247 case RttBw::BW_20MHZ:
1248 return legacy_hal::WIFI_RTT_BW_20;
1249 case RttBw::BW_40MHZ:
1250 return legacy_hal::WIFI_RTT_BW_40;
1251 case RttBw::BW_80MHZ:
1252 return legacy_hal::WIFI_RTT_BW_80;
1253 case RttBw::BW_160MHZ:
1254 return legacy_hal::WIFI_RTT_BW_160;
1255 };
1256 CHECK(false);
1257}
1258
1259RttBw convertLegacyRttBwToHidl(legacy_hal::wifi_rtt_bw type) {
1260 switch (type) {
1261 case legacy_hal::WIFI_RTT_BW_5:
1262 return RttBw::BW_5MHZ;
1263 case legacy_hal::WIFI_RTT_BW_10:
1264 return RttBw::BW_10MHZ;
1265 case legacy_hal::WIFI_RTT_BW_20:
1266 return RttBw::BW_20MHZ;
1267 case legacy_hal::WIFI_RTT_BW_40:
1268 return RttBw::BW_40MHZ;
1269 case legacy_hal::WIFI_RTT_BW_80:
1270 return RttBw::BW_80MHZ;
1271 case legacy_hal::WIFI_RTT_BW_160:
1272 return RttBw::BW_160MHZ;
1273 };
1274 CHECK(false) << "Unknown legacy type: " << type;
1275}
1276
1277legacy_hal::wifi_motion_pattern convertHidlRttMotionPatternToLegacy(
1278 RttMotionPattern type) {
1279 switch (type) {
1280 case RttMotionPattern::NOT_EXPECTED:
1281 return legacy_hal::WIFI_MOTION_NOT_EXPECTED;
1282 case RttMotionPattern::EXPECTED:
1283 return legacy_hal::WIFI_MOTION_EXPECTED;
1284 case RttMotionPattern::UNKNOWN:
1285 return legacy_hal::WIFI_MOTION_UNKNOWN;
1286 };
1287 CHECK(false);
1288}
1289
1290WifiRatePreamble convertLegacyWifiRatePreambleToHidl(uint8_t preamble) {
1291 switch (preamble) {
1292 case 0:
1293 return WifiRatePreamble::OFDM;
1294 case 1:
1295 return WifiRatePreamble::CCK;
1296 case 2:
1297 return WifiRatePreamble::HT;
1298 case 3:
1299 return WifiRatePreamble::VHT;
1300 default:
1301 return WifiRatePreamble::RESERVED;
1302 };
1303 CHECK(false) << "Unknown legacy preamble: " << preamble;
1304}
1305
1306WifiRateNss convertLegacyWifiRateNssToHidl(uint8_t nss) {
1307 switch (nss) {
1308 case 0:
1309 return WifiRateNss::NSS_1x1;
1310 case 1:
1311 return WifiRateNss::NSS_2x2;
1312 case 2:
1313 return WifiRateNss::NSS_3x3;
1314 case 3:
1315 return WifiRateNss::NSS_4x4;
1316 };
1317 CHECK(false) << "Unknown legacy nss: " << nss;
1318 return {};
1319}
1320
1321RttStatus convertLegacyRttStatusToHidl(legacy_hal::wifi_rtt_status status) {
1322 switch (status) {
1323 case legacy_hal::RTT_STATUS_SUCCESS:
1324 return RttStatus::SUCCESS;
1325 case legacy_hal::RTT_STATUS_FAILURE:
1326 return RttStatus::FAILURE;
1327 case legacy_hal::RTT_STATUS_FAIL_NO_RSP:
1328 return RttStatus::FAIL_NO_RSP;
1329 case legacy_hal::RTT_STATUS_FAIL_REJECTED:
1330 return RttStatus::FAIL_REJECTED;
1331 case legacy_hal::RTT_STATUS_FAIL_NOT_SCHEDULED_YET:
1332 return RttStatus::FAIL_NOT_SCHEDULED_YET;
1333 case legacy_hal::RTT_STATUS_FAIL_TM_TIMEOUT:
1334 return RttStatus::FAIL_TM_TIMEOUT;
1335 case legacy_hal::RTT_STATUS_FAIL_AP_ON_DIFF_CHANNEL:
1336 return RttStatus::FAIL_AP_ON_DIFF_CHANNEL;
1337 case legacy_hal::RTT_STATUS_FAIL_NO_CAPABILITY:
1338 return RttStatus::FAIL_NO_CAPABILITY;
1339 case legacy_hal::RTT_STATUS_ABORTED:
1340 return RttStatus::ABORTED;
1341 case legacy_hal::RTT_STATUS_FAIL_INVALID_TS:
1342 return RttStatus::FAIL_INVALID_TS;
1343 case legacy_hal::RTT_STATUS_FAIL_PROTOCOL:
1344 return RttStatus::FAIL_PROTOCOL;
1345 case legacy_hal::RTT_STATUS_FAIL_SCHEDULE:
1346 return RttStatus::FAIL_SCHEDULE;
1347 case legacy_hal::RTT_STATUS_FAIL_BUSY_TRY_LATER:
1348 return RttStatus::FAIL_BUSY_TRY_LATER;
1349 case legacy_hal::RTT_STATUS_INVALID_REQ:
1350 return RttStatus::INVALID_REQ;
1351 case legacy_hal::RTT_STATUS_NO_WIFI:
1352 return RttStatus::NO_WIFI;
1353 case legacy_hal::RTT_STATUS_FAIL_FTM_PARAM_OVERRIDE:
1354 return RttStatus::FAIL_FTM_PARAM_OVERRIDE;
1355 };
1356 CHECK(false) << "Unknown legacy status: " << status;
1357}
1358
1359bool convertHidlWifiChannelInfoToLegacy(
1360 const WifiChannelInfo& hidl_info,
1361 legacy_hal::wifi_channel_info* legacy_info) {
1362 if (!legacy_info) {
1363 return false;
1364 }
1365 legacy_info->width = convertHidlWifiChannelWidthToLegacy(hidl_info.width);
1366 legacy_info->center_freq = hidl_info.centerFreq;
1367 legacy_info->center_freq0 = hidl_info.centerFreq0;
1368 legacy_info->center_freq1 = hidl_info.centerFreq1;
1369 return true;
1370}
1371
1372bool convertLegacyWifiChannelInfoToHidl(
1373 const legacy_hal::wifi_channel_info& legacy_info,
1374 WifiChannelInfo* hidl_info) {
1375 if (!hidl_info) {
1376 return false;
1377 }
1378 hidl_info->width = convertLegacyWifiChannelWidthToHidl(legacy_info.width);
1379 hidl_info->centerFreq = legacy_info.center_freq;
1380 hidl_info->centerFreq0 = legacy_info.center_freq0;
1381 hidl_info->centerFreq1 = legacy_info.center_freq1;
1382 return true;
1383}
1384
1385bool convertHidlRttConfigToLegacy(const RttConfig& hidl_config,
1386 legacy_hal::wifi_rtt_config* legacy_config) {
1387 if (!legacy_config) {
1388 return false;
1389 }
1390 CHECK(hidl_config.addr.size() == sizeof(legacy_config->addr));
1391 memcpy(legacy_config->addr, hidl_config.addr.data(), hidl_config.addr.size());
1392 legacy_config->type = convertHidlRttTypeToLegacy(hidl_config.type);
1393 legacy_config->peer = convertHidlRttPeerTypeToLegacy(hidl_config.peer);
1394 if (!convertHidlWifiChannelInfoToLegacy(hidl_config.channel,
1395 &legacy_config->channel)) {
1396 return false;
1397 }
1398 legacy_config->burst_period = hidl_config.burstPeriod;
1399 legacy_config->num_burst = hidl_config.numBurst;
1400 legacy_config->num_frames_per_burst = hidl_config.numFramesPerBurst;
1401 legacy_config->num_retries_per_rtt_frame = hidl_config.numRetriesPerRttFrame;
1402 legacy_config->num_retries_per_ftmr = hidl_config.numRetriesPerFtmr;
1403 legacy_config->LCI_request = hidl_config.mustRequestLci;
1404 legacy_config->LCR_request = hidl_config.mustRequestLcr;
1405 legacy_config->burst_duration = hidl_config.burstDuration;
1406 legacy_config->preamble =
1407 convertHidlRttPreambleToLegacy(hidl_config.preamble);
1408 legacy_config->bw = convertHidlRttBwToLegacy(hidl_config.bw);
1409 return true;
1410}
1411
Roshan Pius3fae9c82016-12-02 14:49:41 -08001412bool convertHidlRttLciInformationToLegacy(
1413 const RttLciInformation& hidl_info,
1414 legacy_hal::wifi_lci_information* legacy_info) {
1415 if (!legacy_info) {
1416 return false;
1417 }
1418 legacy_info->latitude = hidl_info.latitude;
1419 legacy_info->longitude = hidl_info.longitude;
1420 legacy_info->altitude = hidl_info.altitude;
1421 legacy_info->latitude_unc = hidl_info.latitudeUnc;
1422 legacy_info->longitude_unc = hidl_info.longitudeUnc;
1423 legacy_info->altitude_unc = hidl_info.altitudeUnc;
1424 legacy_info->motion_pattern =
1425 convertHidlRttMotionPatternToLegacy(hidl_info.motionPattern);
1426 legacy_info->floor = hidl_info.floor;
1427 legacy_info->height_above_floor = hidl_info.heightAboveFloor;
1428 legacy_info->height_unc = hidl_info.heightUnc;
1429 return true;
1430}
1431
1432bool convertHidlRttLcrInformationToLegacy(
1433 const RttLcrInformation& hidl_info,
1434 legacy_hal::wifi_lcr_information* legacy_info) {
1435 if (!legacy_info) {
1436 return false;
1437 }
1438 CHECK(hidl_info.countryCode.size() == sizeof(legacy_info->country_code));
1439 memcpy(legacy_info->country_code,
1440 hidl_info.countryCode.data(),
1441 hidl_info.countryCode.size());
1442 if (hidl_info.civicInfo.size() > sizeof(legacy_info->civic_info)) {
1443 return false;
1444 }
1445 legacy_info->length = hidl_info.civicInfo.size();
1446 memcpy(legacy_info->civic_info,
1447 hidl_info.civicInfo.c_str(),
1448 hidl_info.civicInfo.size());
1449 return true;
1450}
1451
1452bool convertHidlRttResponderToLegacy(
1453 const RttResponder& hidl_responder,
1454 legacy_hal::wifi_rtt_responder* legacy_responder) {
1455 if (!legacy_responder) {
1456 return false;
1457 }
1458 if (!convertHidlWifiChannelInfoToLegacy(hidl_responder.channel,
1459 &legacy_responder->channel)) {
1460 return false;
1461 }
1462 legacy_responder->preamble =
1463 convertHidlRttPreambleToLegacy(hidl_responder.preamble);
1464 return true;
1465}
1466
1467bool convertLegacyRttResponderToHidl(
1468 const legacy_hal::wifi_rtt_responder& legacy_responder,
1469 RttResponder* hidl_responder) {
1470 if (!hidl_responder) {
1471 return false;
1472 }
1473 if (!convertLegacyWifiChannelInfoToHidl(legacy_responder.channel,
1474 &hidl_responder->channel)) {
1475 return false;
1476 }
1477 hidl_responder->preamble =
1478 convertLegacyRttPreambleToHidl(legacy_responder.preamble);
1479 return true;
1480}
1481
1482bool convertLegacyRttCapabilitiesToHidl(
1483 const legacy_hal::wifi_rtt_capabilities& legacy_capabilities,
1484 RttCapabilities* hidl_capabilities) {
1485 if (!hidl_capabilities) {
1486 return false;
1487 }
1488 hidl_capabilities->rttOneSidedSupported =
1489 legacy_capabilities.rtt_one_sided_supported;
1490 hidl_capabilities->rttFtmSupported = legacy_capabilities.rtt_ftm_supported;
1491 hidl_capabilities->lciSupported = legacy_capabilities.lci_support;
1492 hidl_capabilities->lcrSupported = legacy_capabilities.lcr_support;
1493 hidl_capabilities->responderSupported =
1494 legacy_capabilities.responder_supported;
1495 for (const auto flag : {legacy_hal::WIFI_RTT_PREAMBLE_LEGACY,
1496 legacy_hal::WIFI_RTT_PREAMBLE_HT,
1497 legacy_hal::WIFI_RTT_PREAMBLE_VHT}) {
1498 if (legacy_capabilities.preamble_support & flag) {
1499 hidl_capabilities->preambleSupport |=
1500 static_cast<std::underlying_type<RttPreamble>::type>(
1501 convertLegacyRttPreambleToHidl(flag));
1502 }
1503 }
1504 for (const auto flag : {legacy_hal::WIFI_RTT_BW_5,
1505 legacy_hal::WIFI_RTT_BW_10,
1506 legacy_hal::WIFI_RTT_BW_20,
1507 legacy_hal::WIFI_RTT_BW_40,
1508 legacy_hal::WIFI_RTT_BW_80,
1509 legacy_hal::WIFI_RTT_BW_160}) {
1510 if (legacy_capabilities.bw_support & flag) {
1511 hidl_capabilities->bwSupport |=
1512 static_cast<std::underlying_type<RttBw>::type>(
1513 convertLegacyRttBwToHidl(flag));
1514 }
1515 }
1516 hidl_capabilities->mcVersion = legacy_capabilities.mc_version;
1517 return true;
1518}
1519
1520bool convertLegacyWifiRateInfoToHidl(const legacy_hal::wifi_rate& legacy_rate,
1521 WifiRateInfo* hidl_rate) {
1522 if (!hidl_rate) {
1523 return false;
1524 }
1525 hidl_rate->preamble =
1526 convertLegacyWifiRatePreambleToHidl(legacy_rate.preamble);
1527 hidl_rate->nss = convertLegacyWifiRateNssToHidl(legacy_rate.nss);
1528 hidl_rate->bw = convertLegacyWifiChannelWidthToHidl(
1529 static_cast<legacy_hal::wifi_channel_width>(legacy_rate.bw));
1530 hidl_rate->rateMcsIdx = legacy_rate.rateMcsIdx;
1531 hidl_rate->bitRateInKbps = legacy_rate.bitrate;
1532 return true;
1533}
1534
1535bool convertLegacyRttResultToHidl(
1536 const legacy_hal::wifi_rtt_result& legacy_result, RttResult* hidl_result) {
1537 if (!hidl_result) {
1538 return false;
1539 }
1540 CHECK(sizeof(legacy_result.addr) == hidl_result->addr.size());
1541 memcpy(
1542 hidl_result->addr.data(), legacy_result.addr, sizeof(legacy_result.addr));
1543 hidl_result->burstNum = legacy_result.burst_num;
1544 hidl_result->measurementNumber = legacy_result.measurement_number;
1545 hidl_result->successNumber = legacy_result.success_number;
1546 hidl_result->numberPerBurstPeer = legacy_result.number_per_burst_peer;
1547 hidl_result->status = convertLegacyRttStatusToHidl(legacy_result.status);
1548 hidl_result->retryAfterDuration = legacy_result.retry_after_duration;
1549 hidl_result->type = convertLegacyRttTypeToHidl(legacy_result.type);
1550 hidl_result->rssi = legacy_result.rssi;
1551 hidl_result->rssiSpread = legacy_result.rssi_spread;
1552 if (!convertLegacyWifiRateInfoToHidl(legacy_result.tx_rate,
1553 &hidl_result->txRate)) {
1554 return false;
1555 }
1556 if (!convertLegacyWifiRateInfoToHidl(legacy_result.rx_rate,
1557 &hidl_result->rxRate)) {
1558 return false;
1559 }
1560 hidl_result->rtt = legacy_result.rtt;
1561 hidl_result->rttSd = legacy_result.rtt_sd;
1562 hidl_result->rttSpread = legacy_result.rtt_spread;
1563 hidl_result->distanceInMm = legacy_result.distance_mm;
1564 hidl_result->distanceSdInMm = legacy_result.distance_sd_mm;
1565 hidl_result->distanceSpreadInMm = legacy_result.distance_spread_mm;
1566 hidl_result->timeStampInUs = legacy_result.ts;
1567 hidl_result->burstDurationInMs = legacy_result.burst_duration;
1568 hidl_result->negotiatedBurstNum = legacy_result.negotiated_burst_num;
1569 if (!convertLegacyIeToHidl(*legacy_result.LCI, &hidl_result->lci)) {
1570 return false;
1571 }
1572 if (!convertLegacyIeToHidl(*legacy_result.LCR, &hidl_result->lcr)) {
1573 return false;
1574 }
1575 return true;
1576}
Roshan Piuse65edb12016-11-22 13:02:01 -08001577} // namespace hidl_struct_util
1578} // namespace implementation
1579} // namespace V1_0
1580} // namespace wifi
1581} // namespace hardware
1582} // namespace android