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