blob: 1d4ff7927c3c3f271e0a4f7ba8c888d14f38ec63 [file] [log] [blame]
Roshan Piuse65edb12016-11-22 13:02:01 -08001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <android-base/logging.h>
18#include <utils/SystemClock.h>
19
20#include "hidl_struct_util.h"
21
22namespace android {
23namespace hardware {
24namespace wifi {
25namespace V1_0 {
26namespace implementation {
27namespace hidl_struct_util {
28
Roshan Pius32d0ca92016-12-02 11:21:19 -080029uint8_t convertHidlScanReportEventFlagToLegacy(
Roshan Piuse65edb12016-11-22 13:02:01 -080030 StaBackgroundScanBucketEventReportSchemeMask hidl_flag) {
31 using HidlFlag = StaBackgroundScanBucketEventReportSchemeMask;
32 switch (hidl_flag) {
33 case HidlFlag::EACH_SCAN:
34 return REPORT_EVENTS_EACH_SCAN;
35 case HidlFlag::FULL_RESULTS:
36 return REPORT_EVENTS_FULL_RESULTS;
37 case HidlFlag::NO_BATCH:
38 return REPORT_EVENTS_NO_BATCH;
39 };
40}
41
Roshan Pius32d0ca92016-12-02 11:21:19 -080042StaScanDataFlagMask convertLegacyScanDataFlagToHidl(uint8_t legacy_flag) {
43 switch (legacy_flag) {
44 case legacy_hal::WIFI_SCAN_FLAG_INTERRUPTED:
45 return StaScanDataFlagMask::INTERRUPTED;
46 };
47 CHECK(false) << "Unknown legacy flag: " << legacy_flag;
48 // To silence the compiler warning about reaching the end of non-void
49 // function.
50 return StaScanDataFlagMask::INTERRUPTED;
51}
52
Roshan Piuse65edb12016-11-22 13:02:01 -080053bool convertHidlScanParamsToLegacy(
54 const StaBackgroundScanParameters& hidl_scan_params,
55 legacy_hal::wifi_scan_cmd_params* legacy_scan_params) {
56 if (!legacy_scan_params) {
57 return false;
58 }
59 legacy_scan_params->base_period = hidl_scan_params.basePeriodInMs;
60 legacy_scan_params->max_ap_per_scan = hidl_scan_params.maxApPerScan;
61 legacy_scan_params->report_threshold_percent =
62 hidl_scan_params.reportThresholdPercent;
63 legacy_scan_params->report_threshold_num_scans =
64 hidl_scan_params.reportThresholdNumScans;
65 // TODO(b/33194311): Expose these max limits in the HIDL interface.
66 if (hidl_scan_params.buckets.size() > MAX_BUCKETS) {
67 return false;
68 }
69 legacy_scan_params->num_buckets = hidl_scan_params.buckets.size();
70 for (uint32_t bucket_idx = 0; bucket_idx < hidl_scan_params.buckets.size();
71 bucket_idx++) {
72 const StaBackgroundScanBucketParameters& hidl_bucket_spec =
73 hidl_scan_params.buckets[bucket_idx];
74 legacy_hal::wifi_scan_bucket_spec& legacy_bucket_spec =
75 legacy_scan_params->buckets[bucket_idx];
76 legacy_bucket_spec.bucket = bucket_idx;
77 legacy_bucket_spec.band =
78 static_cast<legacy_hal::wifi_band>(hidl_bucket_spec.band);
79 legacy_bucket_spec.period = hidl_bucket_spec.periodInMs;
80 legacy_bucket_spec.max_period = hidl_bucket_spec.exponentialMaxPeriodInMs;
81 legacy_bucket_spec.base = hidl_bucket_spec.exponentialBase;
82 legacy_bucket_spec.step_count = hidl_bucket_spec.exponentialStepCount;
83 legacy_bucket_spec.report_events = 0;
84 using HidlFlag = StaBackgroundScanBucketEventReportSchemeMask;
85 for (const auto flag :
86 {HidlFlag::EACH_SCAN, HidlFlag::FULL_RESULTS, HidlFlag::NO_BATCH}) {
87 if (hidl_bucket_spec.eventReportScheme &
88 static_cast<std::underlying_type<HidlFlag>::type>(flag)) {
89 legacy_bucket_spec.report_events |=
Roshan Pius32d0ca92016-12-02 11:21:19 -080090 convertHidlScanReportEventFlagToLegacy(flag);
Roshan Piuse65edb12016-11-22 13:02:01 -080091 }
92 }
93 // TODO(b/33194311): Expose these max limits in the HIDL interface.
94 if (hidl_bucket_spec.frequencies.size() > MAX_CHANNELS) {
95 return false;
96 }
97 legacy_bucket_spec.num_channels = hidl_bucket_spec.frequencies.size();
98 for (uint32_t freq_idx = 0; freq_idx < hidl_bucket_spec.frequencies.size();
99 freq_idx++) {
100 legacy_bucket_spec.channels[freq_idx].channel =
101 hidl_bucket_spec.frequencies[freq_idx];
102 }
103 }
104 return true;
105}
106
Roshan Pius3fae9c82016-12-02 14:49:41 -0800107bool convertLegacyIeToHidl(
108 const legacy_hal::wifi_information_element& legacy_ie,
109 WifiInformationElement* hidl_ie) {
110 if (!hidl_ie) {
111 return false;
112 }
113 hidl_ie->id = legacy_ie.id;
114 hidl_ie->data =
115 std::vector<uint8_t>(legacy_ie.data, legacy_ie.data + legacy_ie.len);
116 return true;
117}
118
Roshan Piuse65edb12016-11-22 13:02:01 -0800119bool convertLegacyIeBlobToHidl(const uint8_t* ie_blob,
120 uint32_t ie_blob_len,
121 std::vector<WifiInformationElement>* hidl_ies) {
122 if (!ie_blob || !hidl_ies) {
123 return false;
124 }
125 const uint8_t* ies_begin = ie_blob;
126 const uint8_t* ies_end = ie_blob + ie_blob_len;
127 const uint8_t* next_ie = ies_begin;
128 using wifi_ie = legacy_hal::wifi_information_element;
129 constexpr size_t kIeHeaderLen = sizeof(wifi_ie);
130 // Each IE should atleast have the header (i.e |id| & |len| fields).
131 while (next_ie + kIeHeaderLen <= ies_end) {
132 const wifi_ie& legacy_ie = (*reinterpret_cast<const wifi_ie*>(next_ie));
133 uint32_t curr_ie_len = kIeHeaderLen + legacy_ie.len;
134 if (next_ie + curr_ie_len > ies_end) {
135 return false;
136 }
137 WifiInformationElement hidl_ie;
Roshan Pius3fae9c82016-12-02 14:49:41 -0800138 if (!convertLegacyIeToHidl(legacy_ie, &hidl_ie)) {
139 return false;
140 }
Roshan Piuse65edb12016-11-22 13:02:01 -0800141 hidl_ies->push_back(std::move(hidl_ie));
142 next_ie += curr_ie_len;
143 }
144 // Ensure that the blob has been fully consumed.
145 return (next_ie == ies_end);
146}
147
148bool convertLegacyScanResultToHidl(
149 const legacy_hal::wifi_scan_result& legacy_scan_result,
150 bool has_ie_data,
151 StaScanResult* hidl_scan_result) {
152 if (!hidl_scan_result) {
153 return false;
154 }
155 hidl_scan_result->timeStampInUs = legacy_scan_result.ts;
156 hidl_scan_result->ssid = std::vector<uint8_t>(
157 legacy_scan_result.ssid,
158 legacy_scan_result.ssid + sizeof(legacy_scan_result.ssid));
159 memcpy(hidl_scan_result->bssid.data(),
160 legacy_scan_result.bssid,
161 hidl_scan_result->bssid.size());
162 hidl_scan_result->frequency = legacy_scan_result.channel;
163 hidl_scan_result->rssi = legacy_scan_result.rssi;
164 hidl_scan_result->beaconPeriodInMs = legacy_scan_result.beacon_period;
165 hidl_scan_result->capability = legacy_scan_result.capability;
166 if (has_ie_data) {
167 std::vector<WifiInformationElement> ies;
168 if (!convertLegacyIeBlobToHidl(
169 reinterpret_cast<const uint8_t*>(legacy_scan_result.ie_data),
170 legacy_scan_result.ie_length,
171 &ies)) {
172 return false;
173 }
174 hidl_scan_result->informationElements = std::move(ies);
175 }
176 return true;
177}
178
179bool convertLegacyCachedScanResultsToHidl(
180 const legacy_hal::wifi_cached_scan_results& legacy_cached_scan_result,
181 StaScanData* hidl_scan_data) {
182 if (!hidl_scan_data) {
183 return false;
184 }
Roshan Pius32d0ca92016-12-02 11:21:19 -0800185 for (const auto flag : {legacy_hal::WIFI_SCAN_FLAG_INTERRUPTED}) {
186 if (legacy_cached_scan_result.flags & flag) {
187 hidl_scan_data->flags |=
188 static_cast<std::underlying_type<StaScanDataFlagMask>::type>(
189 convertLegacyScanDataFlagToHidl(flag));
190 }
191 }
Roshan Piuse65edb12016-11-22 13:02:01 -0800192 hidl_scan_data->bucketsScanned = legacy_cached_scan_result.buckets_scanned;
193
194 CHECK(legacy_cached_scan_result.num_results >= 0 &&
195 legacy_cached_scan_result.num_results <= MAX_AP_CACHE_PER_SCAN);
196 std::vector<StaScanResult> hidl_scan_results;
197 for (int32_t result_idx = 0;
198 result_idx < legacy_cached_scan_result.num_results;
199 result_idx++) {
200 StaScanResult hidl_scan_result;
201 if (!convertLegacyScanResultToHidl(
202 legacy_cached_scan_result.results[result_idx],
203 false,
204 &hidl_scan_result)) {
205 return false;
206 }
207 hidl_scan_results.push_back(hidl_scan_result);
208 }
209 hidl_scan_data->results = std::move(hidl_scan_results);
210 return true;
211}
212
213bool convertLegacyVectorOfCachedScanResultsToHidl(
214 const std::vector<legacy_hal::wifi_cached_scan_results>&
215 legacy_cached_scan_results,
216 std::vector<StaScanData>* hidl_scan_datas) {
217 if (!hidl_scan_datas) {
218 return false;
219 }
220 for (const auto& legacy_cached_scan_result : legacy_cached_scan_results) {
221 StaScanData hidl_scan_data;
222 if (!convertLegacyCachedScanResultsToHidl(legacy_cached_scan_result,
223 &hidl_scan_data)) {
224 return false;
225 }
226 hidl_scan_datas->push_back(hidl_scan_data);
227 }
228 return true;
229}
230
Roshan Pius32d0ca92016-12-02 11:21:19 -0800231WifiDebugTxPacketFate convertLegacyDebugTxPacketFateToHidl(
232 legacy_hal::wifi_tx_packet_fate fate) {
233 switch (fate) {
234 case legacy_hal::TX_PKT_FATE_ACKED:
235 return WifiDebugTxPacketFate::ACKED;
236 case legacy_hal::TX_PKT_FATE_SENT:
237 return WifiDebugTxPacketFate::SENT;
238 case legacy_hal::TX_PKT_FATE_FW_QUEUED:
239 return WifiDebugTxPacketFate::FW_QUEUED;
240 case legacy_hal::TX_PKT_FATE_FW_DROP_INVALID:
241 return WifiDebugTxPacketFate::FW_DROP_INVALID;
242 case legacy_hal::TX_PKT_FATE_FW_DROP_NOBUFS:
243 return WifiDebugTxPacketFate::FW_DROP_NOBUFS;
244 case legacy_hal::TX_PKT_FATE_FW_DROP_OTHER:
245 return WifiDebugTxPacketFate::FW_DROP_OTHER;
246 case legacy_hal::TX_PKT_FATE_DRV_QUEUED:
247 return WifiDebugTxPacketFate::DRV_QUEUED;
248 case legacy_hal::TX_PKT_FATE_DRV_DROP_INVALID:
249 return WifiDebugTxPacketFate::DRV_DROP_INVALID;
250 case legacy_hal::TX_PKT_FATE_DRV_DROP_NOBUFS:
251 return WifiDebugTxPacketFate::DRV_DROP_NOBUFS;
252 case legacy_hal::TX_PKT_FATE_DRV_DROP_OTHER:
253 return WifiDebugTxPacketFate::DRV_DROP_OTHER;
254 };
Roshan Pius3fae9c82016-12-02 14:49:41 -0800255 CHECK(false) << "Unknown legacy fate type: " << fate;
Roshan Pius32d0ca92016-12-02 11:21:19 -0800256}
257
258WifiDebugRxPacketFate convertLegacyDebugRxPacketFateToHidl(
259 legacy_hal::wifi_rx_packet_fate fate) {
260 switch (fate) {
261 case legacy_hal::RX_PKT_FATE_SUCCESS:
262 return WifiDebugRxPacketFate::SUCCESS;
263 case legacy_hal::RX_PKT_FATE_FW_QUEUED:
264 return WifiDebugRxPacketFate::FW_QUEUED;
265 case legacy_hal::RX_PKT_FATE_FW_DROP_FILTER:
266 return WifiDebugRxPacketFate::FW_DROP_FILTER;
267 case legacy_hal::RX_PKT_FATE_FW_DROP_INVALID:
268 return WifiDebugRxPacketFate::FW_DROP_INVALID;
269 case legacy_hal::RX_PKT_FATE_FW_DROP_NOBUFS:
270 return WifiDebugRxPacketFate::FW_DROP_NOBUFS;
271 case legacy_hal::RX_PKT_FATE_FW_DROP_OTHER:
272 return WifiDebugRxPacketFate::FW_DROP_OTHER;
273 case legacy_hal::RX_PKT_FATE_DRV_QUEUED:
274 return WifiDebugRxPacketFate::DRV_QUEUED;
275 case legacy_hal::RX_PKT_FATE_DRV_DROP_FILTER:
276 return WifiDebugRxPacketFate::DRV_DROP_FILTER;
277 case legacy_hal::RX_PKT_FATE_DRV_DROP_INVALID:
278 return WifiDebugRxPacketFate::DRV_DROP_INVALID;
279 case legacy_hal::RX_PKT_FATE_DRV_DROP_NOBUFS:
280 return WifiDebugRxPacketFate::DRV_DROP_NOBUFS;
281 case legacy_hal::RX_PKT_FATE_DRV_DROP_OTHER:
282 return WifiDebugRxPacketFate::DRV_DROP_OTHER;
283 };
Roshan Pius3fae9c82016-12-02 14:49:41 -0800284 CHECK(false) << "Unknown legacy fate type: " << fate;
Roshan Pius32d0ca92016-12-02 11:21:19 -0800285}
286
287WifiDebugPacketFateFrameType convertLegacyDebugPacketFateFrameTypeToHidl(
288 legacy_hal::frame_type type) {
289 switch (type) {
290 case legacy_hal::FRAME_TYPE_UNKNOWN:
291 return WifiDebugPacketFateFrameType::UNKNOWN;
292 case legacy_hal::FRAME_TYPE_ETHERNET_II:
293 return WifiDebugPacketFateFrameType::ETHERNET_II;
294 case legacy_hal::FRAME_TYPE_80211_MGMT:
295 return WifiDebugPacketFateFrameType::MGMT_80211;
296 };
Roshan Pius3fae9c82016-12-02 14:49:41 -0800297 CHECK(false) << "Unknown legacy frame type: " << type;
Roshan Pius32d0ca92016-12-02 11:21:19 -0800298}
299
300bool convertLegacyDebugPacketFateFrameToHidl(
301 const legacy_hal::frame_info& legacy_frame,
302 WifiDebugPacketFateFrameInfo* hidl_frame) {
303 if (!hidl_frame) {
304 return false;
305 }
306 hidl_frame->frameType =
307 convertLegacyDebugPacketFateFrameTypeToHidl(legacy_frame.payload_type);
308 hidl_frame->frameLen = legacy_frame.frame_len;
309 hidl_frame->driverTimestampUsec = legacy_frame.driver_timestamp_usec;
310 hidl_frame->firmwareTimestampUsec = legacy_frame.firmware_timestamp_usec;
311 const uint8_t* frame_begin = reinterpret_cast<const uint8_t*>(
312 legacy_frame.frame_content.ethernet_ii_bytes);
313 hidl_frame->frameContent =
314 std::vector<uint8_t>(frame_begin, frame_begin + legacy_frame.frame_len);
315 return true;
316}
317
318bool convertLegacyDebugTxPacketFateToHidl(
319 const legacy_hal::wifi_tx_report& legacy_fate,
320 WifiDebugTxPacketFateReport* hidl_fate) {
321 if (!hidl_fate) {
322 return false;
323 }
324 hidl_fate->fate = convertLegacyDebugTxPacketFateToHidl(legacy_fate.fate);
325 return convertLegacyDebugPacketFateFrameToHidl(legacy_fate.frame_inf,
326 &hidl_fate->frameInfo);
327}
328
329bool convertLegacyDebugRxPacketFateToHidl(
330 const legacy_hal::wifi_rx_report& legacy_fate,
331 WifiDebugRxPacketFateReport* hidl_fate) {
332 if (!hidl_fate) {
333 return false;
334 }
335 hidl_fate->fate = convertLegacyDebugRxPacketFateToHidl(legacy_fate.fate);
336 return convertLegacyDebugPacketFateFrameToHidl(legacy_fate.frame_inf,
337 &hidl_fate->frameInfo);
338}
339
Roshan Piuse65edb12016-11-22 13:02:01 -0800340bool convertLegacyLinkLayerStatsToHidl(
341 const legacy_hal::LinkLayerStats& legacy_stats,
342 StaLinkLayerStats* hidl_stats) {
343 if (!hidl_stats) {
344 return false;
345 }
346 // iface legacy_stats conversion.
347 hidl_stats->iface.beaconRx = legacy_stats.iface.beacon_rx;
348 hidl_stats->iface.avgRssiMgmt = legacy_stats.iface.rssi_mgmt;
349 hidl_stats->iface.wmeBePktStats.rxMpdu =
350 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].rx_mpdu;
351 hidl_stats->iface.wmeBePktStats.txMpdu =
352 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].tx_mpdu;
353 hidl_stats->iface.wmeBePktStats.lostMpdu =
354 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].mpdu_lost;
355 hidl_stats->iface.wmeBePktStats.retries =
356 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].retries;
357 hidl_stats->iface.wmeBkPktStats.rxMpdu =
358 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].rx_mpdu;
359 hidl_stats->iface.wmeBkPktStats.txMpdu =
360 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].tx_mpdu;
361 hidl_stats->iface.wmeBkPktStats.lostMpdu =
362 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].mpdu_lost;
363 hidl_stats->iface.wmeBkPktStats.retries =
364 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].retries;
365 hidl_stats->iface.wmeViPktStats.rxMpdu =
366 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].rx_mpdu;
367 hidl_stats->iface.wmeViPktStats.txMpdu =
368 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].tx_mpdu;
369 hidl_stats->iface.wmeViPktStats.lostMpdu =
370 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].mpdu_lost;
371 hidl_stats->iface.wmeViPktStats.retries =
372 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].retries;
373 hidl_stats->iface.wmeVoPktStats.rxMpdu =
374 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].rx_mpdu;
375 hidl_stats->iface.wmeVoPktStats.txMpdu =
376 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].tx_mpdu;
377 hidl_stats->iface.wmeVoPktStats.lostMpdu =
378 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].mpdu_lost;
379 hidl_stats->iface.wmeVoPktStats.retries =
380 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].retries;
381 // radio legacy_stats conversion.
382 hidl_stats->radio.onTimeInMs = legacy_stats.radio.on_time;
383 hidl_stats->radio.txTimeInMs = legacy_stats.radio.tx_time;
384 hidl_stats->radio.rxTimeInMs = legacy_stats.radio.rx_time;
385 hidl_stats->radio.onTimeInMsForScan = legacy_stats.radio.on_time_scan;
386 hidl_stats->radio.txTimeInMsPerLevel = legacy_stats.radio_tx_time_per_levels;
387 // Timestamp in the HAL wrapper here since it's not provided in the legacy
388 // HAL API.
389 hidl_stats->timeStampInMs = uptimeMillis();
390 return true;
391}
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800392
393legacy_hal::NanPublishType convertHidlNanPublishTypeToLegacy(
394 NanPublishType type) {
395 switch (type) {
396 case NanPublishType::UNSOLICITED:
397 return legacy_hal::NAN_PUBLISH_TYPE_UNSOLICITED;
398 case NanPublishType::SOLICITED:
399 return legacy_hal::NAN_PUBLISH_TYPE_SOLICITED;
400 case NanPublishType::UNSOLICITED_SOLICITED:
401 return legacy_hal::NAN_PUBLISH_TYPE_UNSOLICITED_SOLICITED;
402 };
Roshan Pius3fae9c82016-12-02 14:49:41 -0800403 CHECK(false);
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800404}
405
406legacy_hal::NanTxType convertHidlNanTxTypeToLegacy(NanTxType type) {
407 switch (type) {
408 case NanTxType::BROADCAST:
409 return legacy_hal::NAN_TX_TYPE_BROADCAST;
410 case NanTxType::UNICAST:
411 return legacy_hal::NAN_TX_TYPE_UNICAST;
412 };
Roshan Pius3fae9c82016-12-02 14:49:41 -0800413 CHECK(false);
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800414}
415
416legacy_hal::NanMatchAlg convertHidlNanMatchAlgToLegacy(NanMatchAlg type) {
417 switch (type) {
418 case NanMatchAlg::MATCH_ONCE:
419 return legacy_hal::NAN_MATCH_ALG_MATCH_ONCE;
420 case NanMatchAlg::MATCH_CONTINUOUS:
421 return legacy_hal::NAN_MATCH_ALG_MATCH_CONTINUOUS;
422 case NanMatchAlg::MATCH_NEVER:
423 return legacy_hal::NAN_MATCH_ALG_MATCH_NEVER;
424 };
Roshan Pius3fae9c82016-12-02 14:49:41 -0800425 CHECK(false);
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800426}
427
428legacy_hal::NanSubscribeType convertHidlNanSubscribeTypeToLegacy(
429 NanSubscribeType type) {
430 switch (type) {
431 case NanSubscribeType::ACTIVE:
432 return legacy_hal::NAN_SUBSCRIBE_TYPE_ACTIVE;
433 case NanSubscribeType::PASSIVE:
434 return legacy_hal::NAN_SUBSCRIBE_TYPE_PASSIVE;
435 };
Roshan Pius3fae9c82016-12-02 14:49:41 -0800436 CHECK(false);
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800437}
438
439legacy_hal::NanSRFType convertHidlNanSrfTypeToLegacy(NanSrfType type) {
440 switch (type) {
441 case NanSrfType::BLOOM_FILTER:
442 return legacy_hal::NAN_SRF_ATTR_BLOOM_FILTER;
443 case NanSrfType::PARTIAL_MAC_ADDR:
444 return legacy_hal::NAN_SRF_ATTR_PARTIAL_MAC_ADDR;
445 };
Roshan Pius3fae9c82016-12-02 14:49:41 -0800446 CHECK(false);
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800447}
448
449legacy_hal::NanSRFIncludeType convertHidlNanSrfIncludeTypeToLegacy(
450 NanSrfIncludeType type) {
451 switch (type) {
452 case NanSrfIncludeType::DO_NOT_RESPOND:
453 return legacy_hal::NAN_SRF_INCLUDE_DO_NOT_RESPOND;
454 case NanSrfIncludeType::RESPOND:
455 return legacy_hal::NAN_SRF_INCLUDE_RESPOND;
456 };
Roshan Pius3fae9c82016-12-02 14:49:41 -0800457 CHECK(false);
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800458}
459
460NanStatusType convertLegacyNanStatusTypeToHidl(
461 legacy_hal::NanStatusType /* type */) {
462 // TODO: The |NanStatusType| has changed in legacy HAL and no longer in sync
463 // with the HIDL interface.
464 return NanStatusType::SUCCESS;
465}
466
467NanResponseType convertLegacyNanResponseTypeToHidl(
468 legacy_hal::NanResponseType type) {
469 switch (type) {
470 case legacy_hal::NAN_RESPONSE_ENABLED:
471 return NanResponseType::ENABLED;
472 case legacy_hal::NAN_RESPONSE_DISABLED:
473 return NanResponseType::DISABLED;
474 case legacy_hal::NAN_RESPONSE_PUBLISH:
475 return NanResponseType::PUBLISH;
476 case legacy_hal::NAN_RESPONSE_PUBLISH_CANCEL:
477 return NanResponseType::PUBLISH_CANCEL;
478 case legacy_hal::NAN_RESPONSE_TRANSMIT_FOLLOWUP:
479 return NanResponseType::TRANSMIT_FOLLOWUP;
480 case legacy_hal::NAN_RESPONSE_SUBSCRIBE:
481 return NanResponseType::SUBSCRIBE;
482 case legacy_hal::NAN_RESPONSE_SUBSCRIBE_CANCEL:
483 return NanResponseType::SUBSCRIBE_CANCEL;
484 case legacy_hal::NAN_RESPONSE_STATS:
485 // Not present in HIDL. Is going to be deprecated in legacy HAL as well.
486 CHECK(0);
487 case legacy_hal::NAN_RESPONSE_CONFIG:
488 return NanResponseType::CONFIG;
489 case legacy_hal::NAN_RESPONSE_TCA:
490 // Not present in HIDL. Is going to be deprecated in legacy HAL as well.
491 CHECK(0);
492 case legacy_hal::NAN_RESPONSE_ERROR:
493 return NanResponseType::ERROR;
494 case legacy_hal::NAN_RESPONSE_BEACON_SDF_PAYLOAD:
495 return NanResponseType::BEACON_SDF_PAYLOAD;
496 case legacy_hal::NAN_GET_CAPABILITIES:
497 return NanResponseType::GET_CAPABILITIES;
498 case legacy_hal::NAN_DP_INTERFACE_CREATE:
499 return NanResponseType::DP_INTERFACE_CREATE;
500 case legacy_hal::NAN_DP_INTERFACE_DELETE:
501 return NanResponseType::DP_INTERFACE_DELETE;
502 case legacy_hal::NAN_DP_INITIATOR_RESPONSE:
503 return NanResponseType::DP_INITIATOR_RESPONSE;
504 case legacy_hal::NAN_DP_RESPONDER_RESPONSE:
505 return NanResponseType::DP_RESPONDER_RESPONSE;
506 case legacy_hal::NAN_DP_END:
507 return NanResponseType::DP_END;
508 };
Roshan Pius3fae9c82016-12-02 14:49:41 -0800509 CHECK(false) << "Unknown legacy type: " << type;
Roshan Piusf5f51fd2016-12-01 13:54:24 -0800510}
511
512bool convertHidlNanEnableRequestToLegacy(
513 const NanEnableRequest& hidl_request,
514 legacy_hal::NanEnableRequest* legacy_request) {
515 if (!legacy_request) {
516 return false;
517 }
518 legacy_request->master_pref = hidl_request.masterPref;
519 legacy_request->cluster_low = hidl_request.clusterLow;
520 legacy_request->cluster_high = hidl_request.clusterHigh;
521 legacy_request->config_support_5g = hidl_request.validSupport5gVal;
522 legacy_request->support_5g_val = hidl_request.support5gVal;
523 legacy_request->config_sid_beacon = hidl_request.validSidBeaconVal;
524 legacy_request->sid_beacon_val = hidl_request.sidBeaconVal;
525 legacy_request->config_2dot4g_rssi_close =
526 hidl_request.valid2dot4gRssiCloseVal;
527 legacy_request->rssi_close_2dot4g_val = hidl_request.rssiClose2dot4gVal;
528 legacy_request->config_2dot4g_rssi_middle =
529 hidl_request.valid2dot4gRssiMiddleVal;
530 legacy_request->rssi_middle_2dot4g_val = hidl_request.rssiMiddle2dot4gVal;
531 legacy_request->config_2dot4g_rssi_proximity =
532 hidl_request.valid2dot4gRssiProximityVal;
533 legacy_request->rssi_proximity_2dot4g_val =
534 hidl_request.rssiProximity2dot4gVal;
535 legacy_request->config_hop_count_limit = hidl_request.validHopCountLimitVal;
536 legacy_request->hop_count_limit_val = hidl_request.hopCountLimitVal;
537 legacy_request->config_2dot4g_support = hidl_request.valid2dot4gSupportVal;
538 legacy_request->support_2dot4g_val = hidl_request.support2dot4gVal;
539 legacy_request->config_2dot4g_beacons = hidl_request.valid2dot4gBeaconsVal;
540 legacy_request->beacon_2dot4g_val = hidl_request.beacon2dot4gVal;
541 legacy_request->config_2dot4g_sdf = hidl_request.valid2dot4gSdfVal;
542 legacy_request->sdf_2dot4g_val = hidl_request.sdf2dot4gVal;
543 legacy_request->config_5g_beacons = hidl_request.valid5gBeaconsVal;
544 legacy_request->beacon_5g_val = hidl_request.beacon5gVal;
545 legacy_request->config_5g_sdf = hidl_request.valid5gSdfVal;
546 legacy_request->sdf_5g_val = hidl_request.sdf5gVal;
547 legacy_request->config_5g_rssi_close = hidl_request.valid5gRssiCloseVal;
548 legacy_request->rssi_close_5g_val = hidl_request.rssiClose5gVal;
549 legacy_request->config_5g_rssi_middle = hidl_request.valid5gRssiMiddleVal;
550 legacy_request->rssi_middle_5g_val = hidl_request.rssiMiddle5gVal;
551 legacy_request->config_5g_rssi_close_proximity =
552 hidl_request.valid5gRssiCloseProximityVal;
553 legacy_request->rssi_close_proximity_5g_val =
554 hidl_request.rssiCloseProximity5gVal;
555 legacy_request->config_rssi_window_size = hidl_request.validRssiWindowSizeVal;
556 legacy_request->rssi_window_size_val = hidl_request.rssiWindowSizeVal;
557 legacy_request->config_oui = hidl_request.validOuiVal;
558 legacy_request->oui_val = hidl_request.ouiVal;
559 legacy_request->config_intf_addr = hidl_request.validIntfAddrVal;
560 CHECK(hidl_request.intfAddrVal.size() ==
561 sizeof(legacy_request->intf_addr_val));
562 memcpy(legacy_request->intf_addr_val,
563 hidl_request.intfAddrVal.data(),
564 hidl_request.intfAddrVal.size());
565 legacy_request->config_cluster_attribute_val =
566 hidl_request.configClusterAttributeVal;
567 legacy_request->config_scan_params = hidl_request.validScanParamsVal;
568 if (hidl_request.scanParamsVal.dwellTime.size() >
569 sizeof(legacy_request->scan_params_val.dwell_time)) {
570 return false;
571 }
572 memcpy(legacy_request->scan_params_val.dwell_time,
573 hidl_request.scanParamsVal.dwellTime.data(),
574 hidl_request.scanParamsVal.dwellTime.size());
575 if (hidl_request.scanParamsVal.scanPeriod.size() >
576 sizeof(legacy_request->scan_params_val.scan_period)) {
577 return false;
578 }
579 memcpy(legacy_request->scan_params_val.scan_period,
580 hidl_request.scanParamsVal.scanPeriod.data(),
581 hidl_request.scanParamsVal.scanPeriod.size());
582 legacy_request->config_random_factor_force =
583 hidl_request.validRandomFactorForceVal;
584 legacy_request->random_factor_force_val = hidl_request.randomFactorForceVal;
585 legacy_request->config_hop_count_force = hidl_request.validHopCountLimitVal;
586 legacy_request->hop_count_force_val = hidl_request.hopCountLimitVal;
587 legacy_request->config_24g_channel = hidl_request.valid24gChannelVal;
588 legacy_request->channel_24g_val = hidl_request.channel24gVal;
589 legacy_request->config_5g_channel = hidl_request.valid5gChannelVal;
590 legacy_request->channel_5g_val = hidl_request.channel5gVal;
591 return true;
592}
593
594bool convertHidlNanPublishRequestToLegacy(
595 const NanPublishRequest& hidl_request,
596 legacy_hal::NanPublishRequest* legacy_request) {
597 if (!legacy_request) {
598 return false;
599 }
600 legacy_request->publish_id = hidl_request.publishId;
601 legacy_request->ttl = hidl_request.ttl;
602 legacy_request->period = hidl_request.period;
603 legacy_request->publish_type =
604 convertHidlNanPublishTypeToLegacy(hidl_request.publishType);
605 legacy_request->tx_type = convertHidlNanTxTypeToLegacy(hidl_request.txType);
606 legacy_request->publish_count = hidl_request.publishCount;
607 if (hidl_request.serviceName.size() > sizeof(legacy_request->service_name)) {
608 return false;
609 }
610 legacy_request->service_name_len = hidl_request.serviceName.size();
611 memcpy(legacy_request->service_name,
612 hidl_request.serviceName.c_str(),
613 hidl_request.serviceName.size());
614 legacy_request->publish_match_indicator =
615 convertHidlNanMatchAlgToLegacy(hidl_request.publishMatchIndicator);
616 if (hidl_request.serviceSpecificInfo.size() >
617 sizeof(legacy_request->service_specific_info)) {
618 return false;
619 }
620 legacy_request->service_specific_info_len =
621 hidl_request.serviceSpecificInfo.size();
622 memcpy(legacy_request->service_specific_info,
623 hidl_request.serviceSpecificInfo.data(),
624 hidl_request.serviceSpecificInfo.size());
625 if (hidl_request.rxMatchFilter.size() >
626 sizeof(legacy_request->rx_match_filter)) {
627 return false;
628 }
629 legacy_request->rx_match_filter_len = hidl_request.rxMatchFilter.size();
630 memcpy(legacy_request->rx_match_filter,
631 hidl_request.rxMatchFilter.data(),
632 hidl_request.rxMatchFilter.size());
633 if (hidl_request.txMatchFilter.size() >
634 sizeof(legacy_request->tx_match_filter)) {
635 return false;
636 }
637 legacy_request->tx_match_filter_len = hidl_request.txMatchFilter.size();
638 memcpy(legacy_request->tx_match_filter,
639 hidl_request.txMatchFilter.data(),
640 hidl_request.txMatchFilter.size());
641 legacy_request->rssi_threshold_flag = hidl_request.useRssiThreshold;
642 legacy_request->connmap = hidl_request.connmap;
643 legacy_request->recv_indication_cfg = hidl_request.recvIndicationCfg;
644 return true;
645}
646
647bool convertHidlNanPublishCancelRequestToLegacy(
648 const NanPublishCancelRequest& hidl_request,
649 legacy_hal::NanPublishCancelRequest* legacy_request) {
650 legacy_request->publish_id = hidl_request.publishId;
651 return true;
652}
653
654bool convertHidlNanSubscribeRequestToLegacy(
655 const NanSubscribeRequest& hidl_request,
656 legacy_hal::NanSubscribeRequest* legacy_request) {
657 if (!legacy_request) {
658 return false;
659 }
660 legacy_request->subscribe_id = hidl_request.subscribeId;
661 legacy_request->ttl = hidl_request.ttl;
662 legacy_request->period = hidl_request.period;
663 legacy_request->subscribe_type =
664 convertHidlNanSubscribeTypeToLegacy(hidl_request.subscribeType);
665 legacy_request->serviceResponseFilter =
666 convertHidlNanSrfTypeToLegacy(hidl_request.serviceResponseFilter);
667 legacy_request->serviceResponseInclude =
668 convertHidlNanSrfIncludeTypeToLegacy(hidl_request.serviceResponseInclude);
669 legacy_request->useServiceResponseFilter =
670 hidl_request.shouldUseServiceResponseFilter
671 ? legacy_hal::NAN_USE_SRF
672 : legacy_hal::NAN_DO_NOT_USE_SRF;
673 legacy_request->ssiRequiredForMatchIndication =
674 hidl_request.isSsiRequiredForMatchIndication
675 ? legacy_hal::NAN_SSI_REQUIRED_IN_MATCH_IND
676 : legacy_hal::NAN_SSI_NOT_REQUIRED_IN_MATCH_IND;
677 legacy_request->subscribe_match_indicator =
678 convertHidlNanMatchAlgToLegacy(hidl_request.subscribeMatchIndicator);
679 legacy_request->subscribe_count = hidl_request.subscribeCount;
680 if (hidl_request.serviceName.size() > sizeof(legacy_request->service_name)) {
681 return false;
682 }
683 legacy_request->service_name_len = hidl_request.serviceName.size();
684 memcpy(legacy_request->service_name,
685 hidl_request.serviceName.c_str(),
686 hidl_request.serviceName.size());
687 if (hidl_request.serviceSpecificInfo.size() >
688 sizeof(legacy_request->service_specific_info)) {
689 return false;
690 }
691 legacy_request->service_specific_info_len =
692 hidl_request.serviceSpecificInfo.size();
693 memcpy(legacy_request->service_specific_info,
694 hidl_request.serviceSpecificInfo.data(),
695 hidl_request.serviceSpecificInfo.size());
696 if (hidl_request.rxMatchFilter.size() >
697 sizeof(legacy_request->rx_match_filter)) {
698 return false;
699 }
700 legacy_request->rx_match_filter_len = hidl_request.rxMatchFilter.size();
701 memcpy(legacy_request->rx_match_filter,
702 hidl_request.rxMatchFilter.data(),
703 hidl_request.rxMatchFilter.size());
704 if (hidl_request.txMatchFilter.size() >
705 sizeof(legacy_request->tx_match_filter)) {
706 return false;
707 }
708 legacy_request->tx_match_filter_len = hidl_request.txMatchFilter.size();
709 memcpy(legacy_request->tx_match_filter,
710 hidl_request.txMatchFilter.data(),
711 hidl_request.txMatchFilter.size());
712 legacy_request->rssi_threshold_flag = hidl_request.useRssiThreshold;
713 legacy_request->connmap = hidl_request.connmap;
714 if (hidl_request.intfAddr.size() > NAN_MAX_SUBSCRIBE_MAX_ADDRESS) {
715 return false;
716 }
717 legacy_request->num_intf_addr_present = hidl_request.intfAddr.size();
718 for (uint32_t i = 0; i < hidl_request.intfAddr.size(); i++) {
719 CHECK(hidl_request.intfAddr[i].size() ==
720 sizeof(legacy_request->intf_addr[i]));
721 memcpy(legacy_request->intf_addr[i],
722 hidl_request.intfAddr[i].data(),
723 hidl_request.intfAddr[i].size());
724 }
725 legacy_request->recv_indication_cfg = hidl_request.recvIndicationCfg;
726 return true;
727}
728
729bool convertHidlNanSubscribeCancelRequestToLegacy(
730 const NanSubscribeCancelRequest& /* hidl_request */,
731 legacy_hal::NanSubscribeCancelRequest* /* legacy_request */) {
732 return false;
733}
734
735bool convertHidlNanTransmitFollowupRequestToLegacy(
736 const NanTransmitFollowupRequest& /* hidl_request */,
737 legacy_hal::NanTransmitFollowupRequest* /* legacy_request */) {
738 return false;
739}
740
741bool convertHidlNanConfigRequestToLegacy(
742 const NanConfigRequest& /* hidl_request */,
743 legacy_hal::NanConfigRequest* /* legacy_request */) {
744 return false;
745}
746
747bool convertHidlNanBeaconSdfPayloadRequestToLegacy(
748 const NanBeaconSdfPayloadRequest& /* hidl_request */,
749 legacy_hal::NanBeaconSdfPayloadRequest* /* legacy_request */) {
750 return false;
751}
752
753bool convertHidlNanDataPathInitiatorRequestToLegacy(
754 const NanDataPathInitiatorRequest& /* hidl_request */,
755 legacy_hal::NanDataPathInitiatorRequest* /* legacy_request */) {
756 return false;
757}
758
759bool convertHidlNanDataPathIndicationResponseToLegacy(
760 const NanDataPathIndicationResponse& /* hidl_response */,
761 legacy_hal::NanDataPathIndicationResponse* /* legacy_response */) {
762 return false;
763}
764
765bool convertHidlNanDataPathEndRequestToLegacy(
766 const NanDataPathEndRequest& /* hidl_request */,
767 legacy_hal::NanDataPathEndRequest* /* legacy_request */) {
768 return false;
769}
770
771bool convertLegacyNanResponseHeaderToHidl(
772 const legacy_hal::NanResponseMsg& legacy_response,
773 NanResponseMsgHeader* hidl_response) {
774 if (!hidl_response) {
775 return false;
776 }
777 hidl_response->status =
778 convertLegacyNanStatusTypeToHidl(legacy_response.status);
779 hidl_response->value = legacy_response.value;
780 hidl_response->responseType =
781 convertLegacyNanResponseTypeToHidl(legacy_response.response_type);
782 return true;
783}
784
785bool convertLegacyNanPublishResponseToHidl(
786 const legacy_hal::NanPublishResponse& /* legacy_response */,
787 NanPublishResponse* /* hidl_response */) {
788 return false;
789}
790
791bool convertLegacyNanSubscribeResponseToHidl(
792 const legacy_hal::NanSubscribeResponse& /* legacy_response */,
793 NanSubscribeResponse* /* hidl_response */) {
794 return false;
795}
796
797bool convertLegacyNanDataPathResponseToHidl(
798 const legacy_hal::NanDataPathRequestResponse& /* legacy_response */,
799 NanDataPathResponse* /* hidl_response */) {
800 return false;
801}
802
803bool convertLegacyNanCapabilitiesResponseToHidl(
804 const legacy_hal::NanCapabilities& /* legacy_response */,
805 NanCapabilitiesResponse* /* hidl_response */) {
806 return false;
807}
808
809bool convertLegacyNanPublishTerminatedIndToHidl(
810 const legacy_hal::NanPublishTerminatedInd& /* legacy_ind */,
811 NanPublishTerminatedInd* /* hidl_ind */) {
812 return false;
813}
814
815bool convertLegacyNanMatchIndToHidl(
816 const legacy_hal::NanMatchInd& /* legacy_ind */,
817 NanMatchInd* /* hidl_ind */) {
818 return false;
819}
820
821bool convertLegacyNanMatchExpiredIndToHidl(
822 const legacy_hal::NanMatchExpiredInd& /* legacy_ind */,
823 NanMatchExpiredInd* /* hidl_ind */) {
824 return false;
825}
826
827bool convertLegacyNanSubscribeTerminatedIndToHidl(
828 const legacy_hal::NanSubscribeTerminatedInd& /* legacy_ind */,
829 NanSubscribeTerminatedInd* /* hidl_ind */) {
830 return false;
831}
832
833bool convertLegacyNanFollowupIndToHidl(
834 const legacy_hal::NanFollowupInd& /* legacy_ind */,
835 NanFollowupInd* /* hidl_ind */) {
836 return false;
837}
838
839bool convertLegacyNanDiscEngEventIndToHidl(
840 const legacy_hal::NanDiscEngEventInd& /* legacy_ind */,
841 NanDiscEngEventInd* /* hidl_ind */) {
842 return false;
843}
844
845bool convertLegacyNanDisabledIndToHidl(
846 const legacy_hal::NanDisabledInd& /* legacy_ind */,
847 NanDisabledInd* /* hidl_ind */) {
848 return false;
849}
850
851bool convertLegacyNanBeaconSdfPayloadIndToHidl(
852 const legacy_hal::NanBeaconSdfPayloadInd& /* legacy_ind */,
853 NanBeaconSdfPayloadInd* /* hidl_ind */) {
854 return false;
855}
856
857bool convertLegacyNanDataPathRequestIndToHidl(
858 const legacy_hal::NanDataPathRequestInd& /* legacy_ind */,
859 NanDataPathRequestInd* /* hidl_ind */) {
860 return false;
861}
862
863bool convertLegacyNanDataPathConfirmIndToHidl(
864 const legacy_hal::NanDataPathConfirmInd& /* legacy_ind */,
865 NanDataPathConfirmInd* /* hidl_ind */) {
866 return false;
867}
868
869bool convertLegacyNanDataPathEndIndToHidl(
870 const legacy_hal::NanDataPathEndInd& /* legacy_ind */,
871 NanDataPathEndInd* /* hidl_ind */) {
872 return false;
873}
874
875bool convertLegacyNanTransmitFollowupIndToHidl(
876 const legacy_hal::NanTransmitFollowupInd& /* legacy_ind */,
877 NanTransmitFollowupInd* /* hidl_ind */) {
878 return false;
879}
Roshan Pius3fae9c82016-12-02 14:49:41 -0800880
881legacy_hal::wifi_rtt_type convertHidlRttTypeToLegacy(RttType type) {
882 switch (type) {
883 case RttType::ONE_SIDED:
884 return legacy_hal::RTT_TYPE_1_SIDED;
885 case RttType::TWO_SIDED:
886 return legacy_hal::RTT_TYPE_2_SIDED;
887 };
888 CHECK(false);
889}
890
891RttType convertLegacyRttTypeToHidl(legacy_hal::wifi_rtt_type type) {
892 switch (type) {
893 case legacy_hal::RTT_TYPE_1_SIDED:
894 return RttType::ONE_SIDED;
895 case legacy_hal::RTT_TYPE_2_SIDED:
896 return RttType::TWO_SIDED;
897 };
898 CHECK(false) << "Unknown legacy type: " << type;
899}
900
901legacy_hal::rtt_peer_type convertHidlRttPeerTypeToLegacy(RttPeerType type) {
902 switch (type) {
903 case RttPeerType::AP:
904 return legacy_hal::RTT_PEER_AP;
905 case RttPeerType::STA:
906 return legacy_hal::RTT_PEER_STA;
907 case RttPeerType::P2P_GO:
908 return legacy_hal::RTT_PEER_P2P_GO;
909 case RttPeerType::P2P_CLIENT:
910 return legacy_hal::RTT_PEER_P2P_CLIENT;
911 case RttPeerType::NAN:
912 return legacy_hal::RTT_PEER_NAN;
913 };
914 CHECK(false);
915}
916
917legacy_hal::wifi_channel_width convertHidlWifiChannelWidthToLegacy(
918 WifiChannelWidthInMhz type) {
919 switch (type) {
920 case WifiChannelWidthInMhz::WIDTH_20:
921 return legacy_hal::WIFI_CHAN_WIDTH_20;
922 case WifiChannelWidthInMhz::WIDTH_40:
923 return legacy_hal::WIFI_CHAN_WIDTH_40;
924 case WifiChannelWidthInMhz::WIDTH_80:
925 return legacy_hal::WIFI_CHAN_WIDTH_80;
926 case WifiChannelWidthInMhz::WIDTH_160:
927 return legacy_hal::WIFI_CHAN_WIDTH_160;
928 case WifiChannelWidthInMhz::WIDTH_80P80:
929 return legacy_hal::WIFI_CHAN_WIDTH_80P80;
930 case WifiChannelWidthInMhz::WIDTH_5:
931 return legacy_hal::WIFI_CHAN_WIDTH_5;
932 case WifiChannelWidthInMhz::WIDTH_10:
933 return legacy_hal::WIFI_CHAN_WIDTH_10;
934 case WifiChannelWidthInMhz::WIDTH_INVALID:
935 return legacy_hal::WIFI_CHAN_WIDTH_INVALID;
936 };
937 CHECK(false);
938}
939
940WifiChannelWidthInMhz convertLegacyWifiChannelWidthToHidl(
941 legacy_hal::wifi_channel_width type) {
942 switch (type) {
943 case legacy_hal::WIFI_CHAN_WIDTH_20:
944 return WifiChannelWidthInMhz::WIDTH_20;
945 case legacy_hal::WIFI_CHAN_WIDTH_40:
946 return WifiChannelWidthInMhz::WIDTH_40;
947 case legacy_hal::WIFI_CHAN_WIDTH_80:
948 return WifiChannelWidthInMhz::WIDTH_80;
949 case legacy_hal::WIFI_CHAN_WIDTH_160:
950 return WifiChannelWidthInMhz::WIDTH_160;
951 case legacy_hal::WIFI_CHAN_WIDTH_80P80:
952 return WifiChannelWidthInMhz::WIDTH_80P80;
953 case legacy_hal::WIFI_CHAN_WIDTH_5:
954 return WifiChannelWidthInMhz::WIDTH_5;
955 case legacy_hal::WIFI_CHAN_WIDTH_10:
956 return WifiChannelWidthInMhz::WIDTH_10;
957 case legacy_hal::WIFI_CHAN_WIDTH_INVALID:
958 return WifiChannelWidthInMhz::WIDTH_INVALID;
959 };
960 CHECK(false) << "Unknown legacy type: " << type;
961}
962
963legacy_hal::wifi_rtt_preamble convertHidlRttPreambleToLegacy(RttPreamble type) {
964 switch (type) {
965 case RttPreamble::LEGACY:
966 return legacy_hal::WIFI_RTT_PREAMBLE_LEGACY;
967 case RttPreamble::HT:
968 return legacy_hal::WIFI_RTT_PREAMBLE_HT;
969 case RttPreamble::VHT:
970 return legacy_hal::WIFI_RTT_PREAMBLE_VHT;
971 };
972 CHECK(false);
973}
974
975RttPreamble convertLegacyRttPreambleToHidl(legacy_hal::wifi_rtt_preamble type) {
976 switch (type) {
977 case legacy_hal::WIFI_RTT_PREAMBLE_LEGACY:
978 return RttPreamble::LEGACY;
979 case legacy_hal::WIFI_RTT_PREAMBLE_HT:
980 return RttPreamble::HT;
981 case legacy_hal::WIFI_RTT_PREAMBLE_VHT:
982 return RttPreamble::VHT;
983 };
984 CHECK(false) << "Unknown legacy type: " << type;
985}
986
987legacy_hal::wifi_rtt_bw convertHidlRttBwToLegacy(RttBw type) {
988 switch (type) {
989 case RttBw::BW_5MHZ:
990 return legacy_hal::WIFI_RTT_BW_5;
991 case RttBw::BW_10MHZ:
992 return legacy_hal::WIFI_RTT_BW_10;
993 case RttBw::BW_20MHZ:
994 return legacy_hal::WIFI_RTT_BW_20;
995 case RttBw::BW_40MHZ:
996 return legacy_hal::WIFI_RTT_BW_40;
997 case RttBw::BW_80MHZ:
998 return legacy_hal::WIFI_RTT_BW_80;
999 case RttBw::BW_160MHZ:
1000 return legacy_hal::WIFI_RTT_BW_160;
1001 };
1002 CHECK(false);
1003}
1004
1005RttBw convertLegacyRttBwToHidl(legacy_hal::wifi_rtt_bw type) {
1006 switch (type) {
1007 case legacy_hal::WIFI_RTT_BW_5:
1008 return RttBw::BW_5MHZ;
1009 case legacy_hal::WIFI_RTT_BW_10:
1010 return RttBw::BW_10MHZ;
1011 case legacy_hal::WIFI_RTT_BW_20:
1012 return RttBw::BW_20MHZ;
1013 case legacy_hal::WIFI_RTT_BW_40:
1014 return RttBw::BW_40MHZ;
1015 case legacy_hal::WIFI_RTT_BW_80:
1016 return RttBw::BW_80MHZ;
1017 case legacy_hal::WIFI_RTT_BW_160:
1018 return RttBw::BW_160MHZ;
1019 };
1020 CHECK(false) << "Unknown legacy type: " << type;
1021}
1022
1023legacy_hal::wifi_motion_pattern convertHidlRttMotionPatternToLegacy(
1024 RttMotionPattern type) {
1025 switch (type) {
1026 case RttMotionPattern::NOT_EXPECTED:
1027 return legacy_hal::WIFI_MOTION_NOT_EXPECTED;
1028 case RttMotionPattern::EXPECTED:
1029 return legacy_hal::WIFI_MOTION_EXPECTED;
1030 case RttMotionPattern::UNKNOWN:
1031 return legacy_hal::WIFI_MOTION_UNKNOWN;
1032 };
1033 CHECK(false);
1034}
1035
1036WifiRatePreamble convertLegacyWifiRatePreambleToHidl(uint8_t preamble) {
1037 switch (preamble) {
1038 case 0:
1039 return WifiRatePreamble::OFDM;
1040 case 1:
1041 return WifiRatePreamble::CCK;
1042 case 2:
1043 return WifiRatePreamble::HT;
1044 case 3:
1045 return WifiRatePreamble::VHT;
1046 default:
1047 return WifiRatePreamble::RESERVED;
1048 };
1049 CHECK(false) << "Unknown legacy preamble: " << preamble;
1050}
1051
1052WifiRateNss convertLegacyWifiRateNssToHidl(uint8_t nss) {
1053 switch (nss) {
1054 case 0:
1055 return WifiRateNss::NSS_1x1;
1056 case 1:
1057 return WifiRateNss::NSS_2x2;
1058 case 2:
1059 return WifiRateNss::NSS_3x3;
1060 case 3:
1061 return WifiRateNss::NSS_4x4;
1062 };
1063 CHECK(false) << "Unknown legacy nss: " << nss;
1064 return {};
1065}
1066
1067RttStatus convertLegacyRttStatusToHidl(legacy_hal::wifi_rtt_status status) {
1068 switch (status) {
1069 case legacy_hal::RTT_STATUS_SUCCESS:
1070 return RttStatus::SUCCESS;
1071 case legacy_hal::RTT_STATUS_FAILURE:
1072 return RttStatus::FAILURE;
1073 case legacy_hal::RTT_STATUS_FAIL_NO_RSP:
1074 return RttStatus::FAIL_NO_RSP;
1075 case legacy_hal::RTT_STATUS_FAIL_REJECTED:
1076 return RttStatus::FAIL_REJECTED;
1077 case legacy_hal::RTT_STATUS_FAIL_NOT_SCHEDULED_YET:
1078 return RttStatus::FAIL_NOT_SCHEDULED_YET;
1079 case legacy_hal::RTT_STATUS_FAIL_TM_TIMEOUT:
1080 return RttStatus::FAIL_TM_TIMEOUT;
1081 case legacy_hal::RTT_STATUS_FAIL_AP_ON_DIFF_CHANNEL:
1082 return RttStatus::FAIL_AP_ON_DIFF_CHANNEL;
1083 case legacy_hal::RTT_STATUS_FAIL_NO_CAPABILITY:
1084 return RttStatus::FAIL_NO_CAPABILITY;
1085 case legacy_hal::RTT_STATUS_ABORTED:
1086 return RttStatus::ABORTED;
1087 case legacy_hal::RTT_STATUS_FAIL_INVALID_TS:
1088 return RttStatus::FAIL_INVALID_TS;
1089 case legacy_hal::RTT_STATUS_FAIL_PROTOCOL:
1090 return RttStatus::FAIL_PROTOCOL;
1091 case legacy_hal::RTT_STATUS_FAIL_SCHEDULE:
1092 return RttStatus::FAIL_SCHEDULE;
1093 case legacy_hal::RTT_STATUS_FAIL_BUSY_TRY_LATER:
1094 return RttStatus::FAIL_BUSY_TRY_LATER;
1095 case legacy_hal::RTT_STATUS_INVALID_REQ:
1096 return RttStatus::INVALID_REQ;
1097 case legacy_hal::RTT_STATUS_NO_WIFI:
1098 return RttStatus::NO_WIFI;
1099 case legacy_hal::RTT_STATUS_FAIL_FTM_PARAM_OVERRIDE:
1100 return RttStatus::FAIL_FTM_PARAM_OVERRIDE;
1101 };
1102 CHECK(false) << "Unknown legacy status: " << status;
1103}
1104
1105bool convertHidlWifiChannelInfoToLegacy(
1106 const WifiChannelInfo& hidl_info,
1107 legacy_hal::wifi_channel_info* legacy_info) {
1108 if (!legacy_info) {
1109 return false;
1110 }
1111 legacy_info->width = convertHidlWifiChannelWidthToLegacy(hidl_info.width);
1112 legacy_info->center_freq = hidl_info.centerFreq;
1113 legacy_info->center_freq0 = hidl_info.centerFreq0;
1114 legacy_info->center_freq1 = hidl_info.centerFreq1;
1115 return true;
1116}
1117
1118bool convertLegacyWifiChannelInfoToHidl(
1119 const legacy_hal::wifi_channel_info& legacy_info,
1120 WifiChannelInfo* hidl_info) {
1121 if (!hidl_info) {
1122 return false;
1123 }
1124 hidl_info->width = convertLegacyWifiChannelWidthToHidl(legacy_info.width);
1125 hidl_info->centerFreq = legacy_info.center_freq;
1126 hidl_info->centerFreq0 = legacy_info.center_freq0;
1127 hidl_info->centerFreq1 = legacy_info.center_freq1;
1128 return true;
1129}
1130
1131bool convertHidlRttConfigToLegacy(const RttConfig& hidl_config,
1132 legacy_hal::wifi_rtt_config* legacy_config) {
1133 if (!legacy_config) {
1134 return false;
1135 }
1136 CHECK(hidl_config.addr.size() == sizeof(legacy_config->addr));
1137 memcpy(legacy_config->addr, hidl_config.addr.data(), hidl_config.addr.size());
1138 legacy_config->type = convertHidlRttTypeToLegacy(hidl_config.type);
1139 legacy_config->peer = convertHidlRttPeerTypeToLegacy(hidl_config.peer);
1140 if (!convertHidlWifiChannelInfoToLegacy(hidl_config.channel,
1141 &legacy_config->channel)) {
1142 return false;
1143 }
1144 legacy_config->burst_period = hidl_config.burstPeriod;
1145 legacy_config->num_burst = hidl_config.numBurst;
1146 legacy_config->num_frames_per_burst = hidl_config.numFramesPerBurst;
1147 legacy_config->num_retries_per_rtt_frame = hidl_config.numRetriesPerRttFrame;
1148 legacy_config->num_retries_per_ftmr = hidl_config.numRetriesPerFtmr;
1149 legacy_config->LCI_request = hidl_config.mustRequestLci;
1150 legacy_config->LCR_request = hidl_config.mustRequestLcr;
1151 legacy_config->burst_duration = hidl_config.burstDuration;
1152 legacy_config->preamble =
1153 convertHidlRttPreambleToLegacy(hidl_config.preamble);
1154 legacy_config->bw = convertHidlRttBwToLegacy(hidl_config.bw);
1155 return true;
1156}
1157
1158bool convertHidlRttChannelMapToLegacy(
1159 const RttChannelMap& hidl_map, legacy_hal::wifi_channel_map* legacy_map) {
1160 if (!legacy_map) {
1161 return false;
1162 }
1163 CHECK(hidl_map.availablity.size() == sizeof(legacy_map->availablity));
1164 memcpy(legacy_map->availablity,
1165 hidl_map.availablity.data(),
1166 hidl_map.availablity.size());
1167 return true;
1168}
1169
1170bool convertHidlRttLciInformationToLegacy(
1171 const RttLciInformation& hidl_info,
1172 legacy_hal::wifi_lci_information* legacy_info) {
1173 if (!legacy_info) {
1174 return false;
1175 }
1176 legacy_info->latitude = hidl_info.latitude;
1177 legacy_info->longitude = hidl_info.longitude;
1178 legacy_info->altitude = hidl_info.altitude;
1179 legacy_info->latitude_unc = hidl_info.latitudeUnc;
1180 legacy_info->longitude_unc = hidl_info.longitudeUnc;
1181 legacy_info->altitude_unc = hidl_info.altitudeUnc;
1182 legacy_info->motion_pattern =
1183 convertHidlRttMotionPatternToLegacy(hidl_info.motionPattern);
1184 legacy_info->floor = hidl_info.floor;
1185 legacy_info->height_above_floor = hidl_info.heightAboveFloor;
1186 legacy_info->height_unc = hidl_info.heightUnc;
1187 return true;
1188}
1189
1190bool convertHidlRttLcrInformationToLegacy(
1191 const RttLcrInformation& hidl_info,
1192 legacy_hal::wifi_lcr_information* legacy_info) {
1193 if (!legacy_info) {
1194 return false;
1195 }
1196 CHECK(hidl_info.countryCode.size() == sizeof(legacy_info->country_code));
1197 memcpy(legacy_info->country_code,
1198 hidl_info.countryCode.data(),
1199 hidl_info.countryCode.size());
1200 if (hidl_info.civicInfo.size() > sizeof(legacy_info->civic_info)) {
1201 return false;
1202 }
1203 legacy_info->length = hidl_info.civicInfo.size();
1204 memcpy(legacy_info->civic_info,
1205 hidl_info.civicInfo.c_str(),
1206 hidl_info.civicInfo.size());
1207 return true;
1208}
1209
1210bool convertHidlRttResponderToLegacy(
1211 const RttResponder& hidl_responder,
1212 legacy_hal::wifi_rtt_responder* legacy_responder) {
1213 if (!legacy_responder) {
1214 return false;
1215 }
1216 if (!convertHidlWifiChannelInfoToLegacy(hidl_responder.channel,
1217 &legacy_responder->channel)) {
1218 return false;
1219 }
1220 legacy_responder->preamble =
1221 convertHidlRttPreambleToLegacy(hidl_responder.preamble);
1222 return true;
1223}
1224
1225bool convertLegacyRttResponderToHidl(
1226 const legacy_hal::wifi_rtt_responder& legacy_responder,
1227 RttResponder* hidl_responder) {
1228 if (!hidl_responder) {
1229 return false;
1230 }
1231 if (!convertLegacyWifiChannelInfoToHidl(legacy_responder.channel,
1232 &hidl_responder->channel)) {
1233 return false;
1234 }
1235 hidl_responder->preamble =
1236 convertLegacyRttPreambleToHidl(legacy_responder.preamble);
1237 return true;
1238}
1239
1240bool convertLegacyRttCapabilitiesToHidl(
1241 const legacy_hal::wifi_rtt_capabilities& legacy_capabilities,
1242 RttCapabilities* hidl_capabilities) {
1243 if (!hidl_capabilities) {
1244 return false;
1245 }
1246 hidl_capabilities->rttOneSidedSupported =
1247 legacy_capabilities.rtt_one_sided_supported;
1248 hidl_capabilities->rttFtmSupported = legacy_capabilities.rtt_ftm_supported;
1249 hidl_capabilities->lciSupported = legacy_capabilities.lci_support;
1250 hidl_capabilities->lcrSupported = legacy_capabilities.lcr_support;
1251 hidl_capabilities->responderSupported =
1252 legacy_capabilities.responder_supported;
1253 for (const auto flag : {legacy_hal::WIFI_RTT_PREAMBLE_LEGACY,
1254 legacy_hal::WIFI_RTT_PREAMBLE_HT,
1255 legacy_hal::WIFI_RTT_PREAMBLE_VHT}) {
1256 if (legacy_capabilities.preamble_support & flag) {
1257 hidl_capabilities->preambleSupport |=
1258 static_cast<std::underlying_type<RttPreamble>::type>(
1259 convertLegacyRttPreambleToHidl(flag));
1260 }
1261 }
1262 for (const auto flag : {legacy_hal::WIFI_RTT_BW_5,
1263 legacy_hal::WIFI_RTT_BW_10,
1264 legacy_hal::WIFI_RTT_BW_20,
1265 legacy_hal::WIFI_RTT_BW_40,
1266 legacy_hal::WIFI_RTT_BW_80,
1267 legacy_hal::WIFI_RTT_BW_160}) {
1268 if (legacy_capabilities.bw_support & flag) {
1269 hidl_capabilities->bwSupport |=
1270 static_cast<std::underlying_type<RttBw>::type>(
1271 convertLegacyRttBwToHidl(flag));
1272 }
1273 }
1274 hidl_capabilities->mcVersion = legacy_capabilities.mc_version;
1275 return true;
1276}
1277
1278bool convertLegacyWifiRateInfoToHidl(const legacy_hal::wifi_rate& legacy_rate,
1279 WifiRateInfo* hidl_rate) {
1280 if (!hidl_rate) {
1281 return false;
1282 }
1283 hidl_rate->preamble =
1284 convertLegacyWifiRatePreambleToHidl(legacy_rate.preamble);
1285 hidl_rate->nss = convertLegacyWifiRateNssToHidl(legacy_rate.nss);
1286 hidl_rate->bw = convertLegacyWifiChannelWidthToHidl(
1287 static_cast<legacy_hal::wifi_channel_width>(legacy_rate.bw));
1288 hidl_rate->rateMcsIdx = legacy_rate.rateMcsIdx;
1289 hidl_rate->bitRateInKbps = legacy_rate.bitrate;
1290 return true;
1291}
1292
1293bool convertLegacyRttResultToHidl(
1294 const legacy_hal::wifi_rtt_result& legacy_result, RttResult* hidl_result) {
1295 if (!hidl_result) {
1296 return false;
1297 }
1298 CHECK(sizeof(legacy_result.addr) == hidl_result->addr.size());
1299 memcpy(
1300 hidl_result->addr.data(), legacy_result.addr, sizeof(legacy_result.addr));
1301 hidl_result->burstNum = legacy_result.burst_num;
1302 hidl_result->measurementNumber = legacy_result.measurement_number;
1303 hidl_result->successNumber = legacy_result.success_number;
1304 hidl_result->numberPerBurstPeer = legacy_result.number_per_burst_peer;
1305 hidl_result->status = convertLegacyRttStatusToHidl(legacy_result.status);
1306 hidl_result->retryAfterDuration = legacy_result.retry_after_duration;
1307 hidl_result->type = convertLegacyRttTypeToHidl(legacy_result.type);
1308 hidl_result->rssi = legacy_result.rssi;
1309 hidl_result->rssiSpread = legacy_result.rssi_spread;
1310 if (!convertLegacyWifiRateInfoToHidl(legacy_result.tx_rate,
1311 &hidl_result->txRate)) {
1312 return false;
1313 }
1314 if (!convertLegacyWifiRateInfoToHidl(legacy_result.rx_rate,
1315 &hidl_result->rxRate)) {
1316 return false;
1317 }
1318 hidl_result->rtt = legacy_result.rtt;
1319 hidl_result->rttSd = legacy_result.rtt_sd;
1320 hidl_result->rttSpread = legacy_result.rtt_spread;
1321 hidl_result->distanceInMm = legacy_result.distance_mm;
1322 hidl_result->distanceSdInMm = legacy_result.distance_sd_mm;
1323 hidl_result->distanceSpreadInMm = legacy_result.distance_spread_mm;
1324 hidl_result->timeStampInUs = legacy_result.ts;
1325 hidl_result->burstDurationInMs = legacy_result.burst_duration;
1326 hidl_result->negotiatedBurstNum = legacy_result.negotiated_burst_num;
1327 if (!convertLegacyIeToHidl(*legacy_result.LCI, &hidl_result->lci)) {
1328 return false;
1329 }
1330 if (!convertLegacyIeToHidl(*legacy_result.LCR, &hidl_result->lcr)) {
1331 return false;
1332 }
1333 return true;
1334}
Roshan Piuse65edb12016-11-22 13:02:01 -08001335} // namespace hidl_struct_util
1336} // namespace implementation
1337} // namespace V1_0
1338} // namespace wifi
1339} // namespace hardware
1340} // namespace android