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