1 /* 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 22 namespace android { 23 namespace hardware { 24 namespace wifi { 25 namespace V1_3 { 26 namespace implementation { 27 namespace hidl_struct_util { 28 29 WifiChannelWidthInMhz convertLegacyWifiChannelWidthToHidl( 30 legacy_hal::wifi_channel_width type); 31 32 hidl_string safeConvertChar(const char* str, size_t max_len) { 33 const char* c = str; 34 size_t size = 0; 35 while (*c && (unsigned char)*c < 128 && size < max_len) { 36 ++size; 37 ++c; 38 } 39 return hidl_string(str, size); 40 } 41 42 IWifiChip::ChipCapabilityMask convertLegacyLoggerFeatureToHidlChipCapability( 43 uint32_t feature) { 44 using HidlChipCaps = IWifiChip::ChipCapabilityMask; 45 switch (feature) { 46 case legacy_hal::WIFI_LOGGER_MEMORY_DUMP_SUPPORTED: 47 return HidlChipCaps::DEBUG_MEMORY_FIRMWARE_DUMP; 48 case legacy_hal::WIFI_LOGGER_DRIVER_DUMP_SUPPORTED: 49 return HidlChipCaps::DEBUG_MEMORY_DRIVER_DUMP; 50 case legacy_hal::WIFI_LOGGER_CONNECT_EVENT_SUPPORTED: 51 return HidlChipCaps::DEBUG_RING_BUFFER_CONNECT_EVENT; 52 case legacy_hal::WIFI_LOGGER_POWER_EVENT_SUPPORTED: 53 return HidlChipCaps::DEBUG_RING_BUFFER_POWER_EVENT; 54 case legacy_hal::WIFI_LOGGER_WAKE_LOCK_SUPPORTED: 55 return HidlChipCaps::DEBUG_RING_BUFFER_WAKELOCK_EVENT; 56 }; 57 CHECK(false) << "Unknown legacy feature: " << feature; 58 return {}; 59 } 60 61 IWifiStaIface::StaIfaceCapabilityMask 62 convertLegacyLoggerFeatureToHidlStaIfaceCapability(uint32_t feature) { 63 using HidlStaIfaceCaps = IWifiStaIface::StaIfaceCapabilityMask; 64 switch (feature) { 65 case legacy_hal::WIFI_LOGGER_PACKET_FATE_SUPPORTED: 66 return HidlStaIfaceCaps::DEBUG_PACKET_FATE; 67 }; 68 CHECK(false) << "Unknown legacy feature: " << feature; 69 return {}; 70 } 71 72 V1_3::IWifiChip::ChipCapabilityMask convertLegacyFeatureToHidlChipCapability( 73 uint32_t feature) { 74 using HidlChipCaps = V1_3::IWifiChip::ChipCapabilityMask; 75 switch (feature) { 76 case WIFI_FEATURE_SET_TX_POWER_LIMIT: 77 return HidlChipCaps::SET_TX_POWER_LIMIT; 78 case WIFI_FEATURE_USE_BODY_HEAD_SAR: 79 return HidlChipCaps::USE_BODY_HEAD_SAR; 80 case WIFI_FEATURE_D2D_RTT: 81 return HidlChipCaps::D2D_RTT; 82 case WIFI_FEATURE_D2AP_RTT: 83 return HidlChipCaps::D2AP_RTT; 84 case WIFI_FEATURE_SET_LATENCY_MODE: 85 return HidlChipCaps::SET_LATENCY_MODE; 86 case WIFI_FEATURE_P2P_RAND_MAC: 87 return HidlChipCaps::P2P_RAND_MAC; 88 }; 89 CHECK(false) << "Unknown legacy feature: " << feature; 90 return {}; 91 } 92 93 IWifiStaIface::StaIfaceCapabilityMask 94 convertLegacyFeatureToHidlStaIfaceCapability(uint32_t feature) { 95 using HidlStaIfaceCaps = IWifiStaIface::StaIfaceCapabilityMask; 96 switch (feature) { 97 case WIFI_FEATURE_GSCAN: 98 return HidlStaIfaceCaps::BACKGROUND_SCAN; 99 case WIFI_FEATURE_LINK_LAYER_STATS: 100 return HidlStaIfaceCaps::LINK_LAYER_STATS; 101 case WIFI_FEATURE_RSSI_MONITOR: 102 return HidlStaIfaceCaps::RSSI_MONITOR; 103 case WIFI_FEATURE_CONTROL_ROAMING: 104 return HidlStaIfaceCaps::CONTROL_ROAMING; 105 case WIFI_FEATURE_IE_WHITELIST: 106 return HidlStaIfaceCaps::PROBE_IE_WHITELIST; 107 case WIFI_FEATURE_SCAN_RAND: 108 return HidlStaIfaceCaps::SCAN_RAND; 109 case WIFI_FEATURE_INFRA_5G: 110 return HidlStaIfaceCaps::STA_5G; 111 case WIFI_FEATURE_HOTSPOT: 112 return HidlStaIfaceCaps::HOTSPOT; 113 case WIFI_FEATURE_PNO: 114 return HidlStaIfaceCaps::PNO; 115 case WIFI_FEATURE_TDLS: 116 return HidlStaIfaceCaps::TDLS; 117 case WIFI_FEATURE_TDLS_OFFCHANNEL: 118 return HidlStaIfaceCaps::TDLS_OFFCHANNEL; 119 case WIFI_FEATURE_CONFIG_NDO: 120 return HidlStaIfaceCaps::ND_OFFLOAD; 121 case WIFI_FEATURE_MKEEP_ALIVE: 122 return HidlStaIfaceCaps::KEEP_ALIVE; 123 }; 124 CHECK(false) << "Unknown legacy feature: " << feature; 125 return {}; 126 } 127 128 bool convertLegacyFeaturesToHidlChipCapabilities( 129 uint32_t legacy_feature_set, uint32_t legacy_logger_feature_set, 130 uint32_t* hidl_caps) { 131 if (!hidl_caps) { 132 return false; 133 } 134 *hidl_caps = {}; 135 using HidlChipCaps = IWifiChip::ChipCapabilityMask; 136 for (const auto feature : {legacy_hal::WIFI_LOGGER_MEMORY_DUMP_SUPPORTED, 137 legacy_hal::WIFI_LOGGER_DRIVER_DUMP_SUPPORTED, 138 legacy_hal::WIFI_LOGGER_CONNECT_EVENT_SUPPORTED, 139 legacy_hal::WIFI_LOGGER_POWER_EVENT_SUPPORTED, 140 legacy_hal::WIFI_LOGGER_WAKE_LOCK_SUPPORTED}) { 141 if (feature & legacy_logger_feature_set) { 142 *hidl_caps |= 143 convertLegacyLoggerFeatureToHidlChipCapability(feature); 144 } 145 } 146 std::vector<uint32_t> features = {WIFI_FEATURE_SET_TX_POWER_LIMIT, 147 WIFI_FEATURE_USE_BODY_HEAD_SAR, 148 WIFI_FEATURE_D2D_RTT, 149 WIFI_FEATURE_D2AP_RTT, 150 WIFI_FEATURE_SET_LATENCY_MODE, 151 WIFI_FEATURE_P2P_RAND_MAC}; 152 for (const auto feature : features) { 153 if (feature & legacy_feature_set) { 154 *hidl_caps |= convertLegacyFeatureToHidlChipCapability(feature); 155 } 156 } 157 158 // There are no flags for these 3 in the legacy feature set. Adding them to 159 // the set because all the current devices support it. 160 *hidl_caps |= HidlChipCaps::DEBUG_RING_BUFFER_VENDOR_DATA; 161 *hidl_caps |= HidlChipCaps::DEBUG_HOST_WAKE_REASON_STATS; 162 *hidl_caps |= HidlChipCaps::DEBUG_ERROR_ALERTS; 163 return true; 164 } 165 166 WifiDebugRingBufferFlags convertLegacyDebugRingBufferFlagsToHidl( 167 uint32_t flag) { 168 switch (flag) { 169 case WIFI_RING_BUFFER_FLAG_HAS_BINARY_ENTRIES: 170 return WifiDebugRingBufferFlags::HAS_BINARY_ENTRIES; 171 case WIFI_RING_BUFFER_FLAG_HAS_ASCII_ENTRIES: 172 return WifiDebugRingBufferFlags::HAS_ASCII_ENTRIES; 173 }; 174 CHECK(false) << "Unknown legacy flag: " << flag; 175 return {}; 176 } 177 178 bool convertLegacyDebugRingBufferStatusToHidl( 179 const legacy_hal::wifi_ring_buffer_status& legacy_status, 180 WifiDebugRingBufferStatus* hidl_status) { 181 if (!hidl_status) { 182 return false; 183 } 184 *hidl_status = {}; 185 hidl_status->ringName = 186 safeConvertChar(reinterpret_cast<const char*>(legacy_status.name), 187 sizeof(legacy_status.name)); 188 hidl_status->flags = 0; 189 for (const auto flag : {WIFI_RING_BUFFER_FLAG_HAS_BINARY_ENTRIES, 190 WIFI_RING_BUFFER_FLAG_HAS_ASCII_ENTRIES}) { 191 if (flag & legacy_status.flags) { 192 hidl_status->flags |= static_cast< 193 std::underlying_type<WifiDebugRingBufferFlags>::type>( 194 convertLegacyDebugRingBufferFlagsToHidl(flag)); 195 } 196 } 197 hidl_status->ringId = legacy_status.ring_id; 198 hidl_status->sizeInBytes = legacy_status.ring_buffer_byte_size; 199 // Calculate free size of the ring the buffer. We don't need to send the 200 // exact read/write pointers that were there in the legacy HAL interface. 201 if (legacy_status.written_bytes >= legacy_status.read_bytes) { 202 hidl_status->freeSizeInBytes = 203 legacy_status.ring_buffer_byte_size - 204 (legacy_status.written_bytes - legacy_status.read_bytes); 205 } else { 206 hidl_status->freeSizeInBytes = 207 legacy_status.read_bytes - legacy_status.written_bytes; 208 } 209 hidl_status->verboseLevel = legacy_status.verbose_level; 210 return true; 211 } 212 213 bool convertLegacyVectorOfDebugRingBufferStatusToHidl( 214 const std::vector<legacy_hal::wifi_ring_buffer_status>& legacy_status_vec, 215 std::vector<WifiDebugRingBufferStatus>* hidl_status_vec) { 216 if (!hidl_status_vec) { 217 return false; 218 } 219 *hidl_status_vec = {}; 220 for (const auto& legacy_status : legacy_status_vec) { 221 WifiDebugRingBufferStatus hidl_status; 222 if (!convertLegacyDebugRingBufferStatusToHidl(legacy_status, 223 &hidl_status)) { 224 return false; 225 } 226 hidl_status_vec->push_back(hidl_status); 227 } 228 return true; 229 } 230 231 bool convertLegacyWakeReasonStatsToHidl( 232 const legacy_hal::WakeReasonStats& legacy_stats, 233 WifiDebugHostWakeReasonStats* hidl_stats) { 234 if (!hidl_stats) { 235 return false; 236 } 237 *hidl_stats = {}; 238 hidl_stats->totalCmdEventWakeCnt = 239 legacy_stats.wake_reason_cnt.total_cmd_event_wake; 240 hidl_stats->cmdEventWakeCntPerType = legacy_stats.cmd_event_wake_cnt; 241 hidl_stats->totalDriverFwLocalWakeCnt = 242 legacy_stats.wake_reason_cnt.total_driver_fw_local_wake; 243 hidl_stats->driverFwLocalWakeCntPerType = 244 legacy_stats.driver_fw_local_wake_cnt; 245 hidl_stats->totalRxPacketWakeCnt = 246 legacy_stats.wake_reason_cnt.total_rx_data_wake; 247 hidl_stats->rxPktWakeDetails.rxUnicastCnt = 248 legacy_stats.wake_reason_cnt.rx_wake_details.rx_unicast_cnt; 249 hidl_stats->rxPktWakeDetails.rxMulticastCnt = 250 legacy_stats.wake_reason_cnt.rx_wake_details.rx_multicast_cnt; 251 hidl_stats->rxPktWakeDetails.rxBroadcastCnt = 252 legacy_stats.wake_reason_cnt.rx_wake_details.rx_broadcast_cnt; 253 hidl_stats->rxMulticastPkWakeDetails.ipv4RxMulticastAddrCnt = 254 legacy_stats.wake_reason_cnt.rx_multicast_wake_pkt_info 255 .ipv4_rx_multicast_addr_cnt; 256 hidl_stats->rxMulticastPkWakeDetails.ipv6RxMulticastAddrCnt = 257 legacy_stats.wake_reason_cnt.rx_multicast_wake_pkt_info 258 .ipv6_rx_multicast_addr_cnt; 259 hidl_stats->rxMulticastPkWakeDetails.otherRxMulticastAddrCnt = 260 legacy_stats.wake_reason_cnt.rx_multicast_wake_pkt_info 261 .other_rx_multicast_addr_cnt; 262 hidl_stats->rxIcmpPkWakeDetails.icmpPkt = 263 legacy_stats.wake_reason_cnt.rx_wake_pkt_classification_info.icmp_pkt; 264 hidl_stats->rxIcmpPkWakeDetails.icmp6Pkt = 265 legacy_stats.wake_reason_cnt.rx_wake_pkt_classification_info.icmp6_pkt; 266 hidl_stats->rxIcmpPkWakeDetails.icmp6Ra = 267 legacy_stats.wake_reason_cnt.rx_wake_pkt_classification_info.icmp6_ra; 268 hidl_stats->rxIcmpPkWakeDetails.icmp6Na = 269 legacy_stats.wake_reason_cnt.rx_wake_pkt_classification_info.icmp6_na; 270 hidl_stats->rxIcmpPkWakeDetails.icmp6Ns = 271 legacy_stats.wake_reason_cnt.rx_wake_pkt_classification_info.icmp6_ns; 272 return true; 273 } 274 275 legacy_hal::wifi_power_scenario convertHidlTxPowerScenarioToLegacy( 276 V1_1::IWifiChip::TxPowerScenario hidl_scenario) { 277 switch (hidl_scenario) { 278 // This is the only supported scenario for V1_1 279 case V1_1::IWifiChip::TxPowerScenario::VOICE_CALL: 280 return legacy_hal::WIFI_POWER_SCENARIO_VOICE_CALL; 281 }; 282 CHECK(false); 283 } 284 285 legacy_hal::wifi_power_scenario convertHidlTxPowerScenarioToLegacy_1_2( 286 V1_2::IWifiChip::TxPowerScenario hidl_scenario) { 287 switch (hidl_scenario) { 288 // This is the only supported scenario for V1_1 289 case V1_2::IWifiChip::TxPowerScenario::VOICE_CALL: 290 return legacy_hal::WIFI_POWER_SCENARIO_VOICE_CALL; 291 // Those are the supported scenarios for V1_2 292 case V1_2::IWifiChip::TxPowerScenario::ON_HEAD_CELL_OFF: 293 return legacy_hal::WIFI_POWER_SCENARIO_ON_HEAD_CELL_OFF; 294 case V1_2::IWifiChip::TxPowerScenario::ON_HEAD_CELL_ON: 295 return legacy_hal::WIFI_POWER_SCENARIO_ON_HEAD_CELL_ON; 296 case V1_2::IWifiChip::TxPowerScenario::ON_BODY_CELL_OFF: 297 return legacy_hal::WIFI_POWER_SCENARIO_ON_BODY_CELL_OFF; 298 case V1_2::IWifiChip::TxPowerScenario::ON_BODY_CELL_ON: 299 return legacy_hal::WIFI_POWER_SCENARIO_ON_BODY_CELL_ON; 300 }; 301 CHECK(false); 302 } 303 304 legacy_hal::wifi_latency_mode convertHidlLatencyModeToLegacy( 305 IWifiChip::LatencyMode hidl_latency_mode) { 306 switch (hidl_latency_mode) { 307 case IWifiChip::LatencyMode::NORMAL: 308 return legacy_hal::WIFI_LATENCY_MODE_NORMAL; 309 case IWifiChip::LatencyMode::LOW: 310 return legacy_hal::WIFI_LATENCY_MODE_LOW; 311 } 312 CHECK(false); 313 } 314 315 bool convertLegacyWifiMacInfoToHidl( 316 const legacy_hal::WifiMacInfo& legacy_mac_info, 317 V1_2::IWifiChipEventCallback::RadioModeInfo* hidl_radio_mode_info) { 318 if (!hidl_radio_mode_info) { 319 return false; 320 } 321 *hidl_radio_mode_info = {}; 322 323 hidl_radio_mode_info->radioId = legacy_mac_info.wlan_mac_id; 324 // Convert from bitmask of bands in the legacy HAL to enum value in 325 // the HIDL interface. 326 if (legacy_mac_info.mac_band & legacy_hal::WLAN_MAC_2_4_BAND && 327 legacy_mac_info.mac_band & legacy_hal::WLAN_MAC_5_0_BAND) { 328 hidl_radio_mode_info->bandInfo = WifiBand::BAND_24GHZ_5GHZ; 329 } else if (legacy_mac_info.mac_band & legacy_hal::WLAN_MAC_2_4_BAND) { 330 hidl_radio_mode_info->bandInfo = WifiBand::BAND_24GHZ; 331 } else if (legacy_mac_info.mac_band & legacy_hal::WLAN_MAC_5_0_BAND) { 332 hidl_radio_mode_info->bandInfo = WifiBand::BAND_5GHZ; 333 } else { 334 hidl_radio_mode_info->bandInfo = WifiBand::BAND_UNSPECIFIED; 335 } 336 std::vector<V1_2::IWifiChipEventCallback::IfaceInfo> iface_info_vec; 337 for (const auto& legacy_iface_info : legacy_mac_info.iface_infos) { 338 V1_2::IWifiChipEventCallback::IfaceInfo iface_info; 339 iface_info.name = legacy_iface_info.name; 340 iface_info.channel = legacy_iface_info.channel; 341 iface_info_vec.push_back(iface_info); 342 } 343 hidl_radio_mode_info->ifaceInfos = iface_info_vec; 344 return true; 345 } 346 347 bool convertLegacyWifiMacInfosToHidl( 348 const std::vector<legacy_hal::WifiMacInfo>& legacy_mac_infos, 349 std::vector<V1_2::IWifiChipEventCallback::RadioModeInfo>* 350 hidl_radio_mode_infos) { 351 if (!hidl_radio_mode_infos) { 352 return false; 353 } 354 *hidl_radio_mode_infos = {}; 355 356 for (const auto& legacy_mac_info : legacy_mac_infos) { 357 V1_2::IWifiChipEventCallback::RadioModeInfo hidl_radio_mode_info; 358 if (!convertLegacyWifiMacInfoToHidl(legacy_mac_info, 359 &hidl_radio_mode_info)) { 360 return false; 361 } 362 hidl_radio_mode_infos->push_back(hidl_radio_mode_info); 363 } 364 return true; 365 } 366 367 bool convertLegacyFeaturesToHidlStaCapabilities( 368 uint32_t legacy_feature_set, uint32_t legacy_logger_feature_set, 369 uint32_t* hidl_caps) { 370 if (!hidl_caps) { 371 return false; 372 } 373 *hidl_caps = {}; 374 using HidlStaIfaceCaps = IWifiStaIface::StaIfaceCapabilityMask; 375 for (const auto feature : {legacy_hal::WIFI_LOGGER_PACKET_FATE_SUPPORTED}) { 376 if (feature & legacy_logger_feature_set) { 377 *hidl_caps |= 378 convertLegacyLoggerFeatureToHidlStaIfaceCapability(feature); 379 } 380 } 381 for (const auto feature : 382 {WIFI_FEATURE_GSCAN, WIFI_FEATURE_LINK_LAYER_STATS, 383 WIFI_FEATURE_RSSI_MONITOR, WIFI_FEATURE_CONTROL_ROAMING, 384 WIFI_FEATURE_IE_WHITELIST, WIFI_FEATURE_SCAN_RAND, 385 WIFI_FEATURE_INFRA_5G, WIFI_FEATURE_HOTSPOT, WIFI_FEATURE_PNO, 386 WIFI_FEATURE_TDLS, WIFI_FEATURE_TDLS_OFFCHANNEL, 387 WIFI_FEATURE_CONFIG_NDO, WIFI_FEATURE_MKEEP_ALIVE}) { 388 if (feature & legacy_feature_set) { 389 *hidl_caps |= convertLegacyFeatureToHidlStaIfaceCapability(feature); 390 } 391 } 392 // There is no flag for this one in the legacy feature set. Adding it to the 393 // set because all the current devices support it. 394 *hidl_caps |= HidlStaIfaceCaps::APF; 395 return true; 396 } 397 398 bool convertLegacyApfCapabilitiesToHidl( 399 const legacy_hal::PacketFilterCapabilities& legacy_caps, 400 StaApfPacketFilterCapabilities* hidl_caps) { 401 if (!hidl_caps) { 402 return false; 403 } 404 *hidl_caps = {}; 405 hidl_caps->version = legacy_caps.version; 406 hidl_caps->maxLength = legacy_caps.max_len; 407 return true; 408 } 409 410 uint8_t convertHidlGscanReportEventFlagToLegacy( 411 StaBackgroundScanBucketEventReportSchemeMask hidl_flag) { 412 using HidlFlag = StaBackgroundScanBucketEventReportSchemeMask; 413 switch (hidl_flag) { 414 case HidlFlag::EACH_SCAN: 415 return REPORT_EVENTS_EACH_SCAN; 416 case HidlFlag::FULL_RESULTS: 417 return REPORT_EVENTS_FULL_RESULTS; 418 case HidlFlag::NO_BATCH: 419 return REPORT_EVENTS_NO_BATCH; 420 }; 421 CHECK(false); 422 } 423 424 StaScanDataFlagMask convertLegacyGscanDataFlagToHidl(uint8_t legacy_flag) { 425 switch (legacy_flag) { 426 case legacy_hal::WIFI_SCAN_FLAG_INTERRUPTED: 427 return StaScanDataFlagMask::INTERRUPTED; 428 }; 429 CHECK(false) << "Unknown legacy flag: " << legacy_flag; 430 // To silence the compiler warning about reaching the end of non-void 431 // function. 432 return {}; 433 } 434 435 bool convertLegacyGscanCapabilitiesToHidl( 436 const legacy_hal::wifi_gscan_capabilities& legacy_caps, 437 StaBackgroundScanCapabilities* hidl_caps) { 438 if (!hidl_caps) { 439 return false; 440 } 441 *hidl_caps = {}; 442 hidl_caps->maxCacheSize = legacy_caps.max_scan_cache_size; 443 hidl_caps->maxBuckets = legacy_caps.max_scan_buckets; 444 hidl_caps->maxApCachePerScan = legacy_caps.max_ap_cache_per_scan; 445 hidl_caps->maxReportingThreshold = legacy_caps.max_scan_reporting_threshold; 446 return true; 447 } 448 449 legacy_hal::wifi_band convertHidlWifiBandToLegacy(WifiBand band) { 450 switch (band) { 451 case WifiBand::BAND_UNSPECIFIED: 452 return legacy_hal::WIFI_BAND_UNSPECIFIED; 453 case WifiBand::BAND_24GHZ: 454 return legacy_hal::WIFI_BAND_BG; 455 case WifiBand::BAND_5GHZ: 456 return legacy_hal::WIFI_BAND_A; 457 case WifiBand::BAND_5GHZ_DFS: 458 return legacy_hal::WIFI_BAND_A_DFS; 459 case WifiBand::BAND_5GHZ_WITH_DFS: 460 return legacy_hal::WIFI_BAND_A_WITH_DFS; 461 case WifiBand::BAND_24GHZ_5GHZ: 462 return legacy_hal::WIFI_BAND_ABG; 463 case WifiBand::BAND_24GHZ_5GHZ_WITH_DFS: 464 return legacy_hal::WIFI_BAND_ABG_WITH_DFS; 465 }; 466 CHECK(false); 467 } 468 469 bool convertHidlGscanParamsToLegacy( 470 const StaBackgroundScanParameters& hidl_scan_params, 471 legacy_hal::wifi_scan_cmd_params* legacy_scan_params) { 472 if (!legacy_scan_params) { 473 return false; 474 } 475 *legacy_scan_params = {}; 476 legacy_scan_params->base_period = hidl_scan_params.basePeriodInMs; 477 legacy_scan_params->max_ap_per_scan = hidl_scan_params.maxApPerScan; 478 legacy_scan_params->report_threshold_percent = 479 hidl_scan_params.reportThresholdPercent; 480 legacy_scan_params->report_threshold_num_scans = 481 hidl_scan_params.reportThresholdNumScans; 482 if (hidl_scan_params.buckets.size() > MAX_BUCKETS) { 483 return false; 484 } 485 legacy_scan_params->num_buckets = hidl_scan_params.buckets.size(); 486 for (uint32_t bucket_idx = 0; bucket_idx < hidl_scan_params.buckets.size(); 487 bucket_idx++) { 488 const StaBackgroundScanBucketParameters& hidl_bucket_spec = 489 hidl_scan_params.buckets[bucket_idx]; 490 legacy_hal::wifi_scan_bucket_spec& legacy_bucket_spec = 491 legacy_scan_params->buckets[bucket_idx]; 492 if (hidl_bucket_spec.bucketIdx >= MAX_BUCKETS) { 493 return false; 494 } 495 legacy_bucket_spec.bucket = hidl_bucket_spec.bucketIdx; 496 legacy_bucket_spec.band = 497 convertHidlWifiBandToLegacy(hidl_bucket_spec.band); 498 legacy_bucket_spec.period = hidl_bucket_spec.periodInMs; 499 legacy_bucket_spec.max_period = 500 hidl_bucket_spec.exponentialMaxPeriodInMs; 501 legacy_bucket_spec.base = hidl_bucket_spec.exponentialBase; 502 legacy_bucket_spec.step_count = hidl_bucket_spec.exponentialStepCount; 503 legacy_bucket_spec.report_events = 0; 504 using HidlFlag = StaBackgroundScanBucketEventReportSchemeMask; 505 for (const auto flag : {HidlFlag::EACH_SCAN, HidlFlag::FULL_RESULTS, 506 HidlFlag::NO_BATCH}) { 507 if (hidl_bucket_spec.eventReportScheme & 508 static_cast<std::underlying_type<HidlFlag>::type>(flag)) { 509 legacy_bucket_spec.report_events |= 510 convertHidlGscanReportEventFlagToLegacy(flag); 511 } 512 } 513 if (hidl_bucket_spec.frequencies.size() > MAX_CHANNELS) { 514 return false; 515 } 516 legacy_bucket_spec.num_channels = hidl_bucket_spec.frequencies.size(); 517 for (uint32_t freq_idx = 0; 518 freq_idx < hidl_bucket_spec.frequencies.size(); freq_idx++) { 519 legacy_bucket_spec.channels[freq_idx].channel = 520 hidl_bucket_spec.frequencies[freq_idx]; 521 } 522 } 523 return true; 524 } 525 526 bool convertLegacyIeToHidl( 527 const legacy_hal::wifi_information_element& legacy_ie, 528 WifiInformationElement* hidl_ie) { 529 if (!hidl_ie) { 530 return false; 531 } 532 *hidl_ie = {}; 533 hidl_ie->id = legacy_ie.id; 534 hidl_ie->data = 535 std::vector<uint8_t>(legacy_ie.data, legacy_ie.data + legacy_ie.len); 536 return true; 537 } 538 539 bool convertLegacyIeBlobToHidl(const uint8_t* ie_blob, uint32_t ie_blob_len, 540 std::vector<WifiInformationElement>* hidl_ies) { 541 if (!ie_blob || !hidl_ies) { 542 return false; 543 } 544 *hidl_ies = {}; 545 const uint8_t* ies_begin = ie_blob; 546 const uint8_t* ies_end = ie_blob + ie_blob_len; 547 const uint8_t* next_ie = ies_begin; 548 using wifi_ie = legacy_hal::wifi_information_element; 549 constexpr size_t kIeHeaderLen = sizeof(wifi_ie); 550 // Each IE should atleast have the header (i.e |id| & |len| fields). 551 while (next_ie + kIeHeaderLen <= ies_end) { 552 const wifi_ie& legacy_ie = (*reinterpret_cast<const wifi_ie*>(next_ie)); 553 uint32_t curr_ie_len = kIeHeaderLen + legacy_ie.len; 554 if (next_ie + curr_ie_len > ies_end) { 555 LOG(ERROR) << "Error parsing IE blob. Next IE: " << (void*)next_ie 556 << ", Curr IE len: " << curr_ie_len 557 << ", IEs End: " << (void*)ies_end; 558 break; 559 } 560 WifiInformationElement hidl_ie; 561 if (!convertLegacyIeToHidl(legacy_ie, &hidl_ie)) { 562 LOG(ERROR) << "Error converting IE. Id: " << legacy_ie.id 563 << ", len: " << legacy_ie.len; 564 break; 565 } 566 hidl_ies->push_back(std::move(hidl_ie)); 567 next_ie += curr_ie_len; 568 } 569 // Check if the blob has been fully consumed. 570 if (next_ie != ies_end) { 571 LOG(ERROR) << "Failed to fully parse IE blob. Next IE: " 572 << (void*)next_ie << ", IEs End: " << (void*)ies_end; 573 } 574 return true; 575 } 576 577 bool convertLegacyGscanResultToHidl( 578 const legacy_hal::wifi_scan_result& legacy_scan_result, bool has_ie_data, 579 StaScanResult* hidl_scan_result) { 580 if (!hidl_scan_result) { 581 return false; 582 } 583 *hidl_scan_result = {}; 584 hidl_scan_result->timeStampInUs = legacy_scan_result.ts; 585 hidl_scan_result->ssid = std::vector<uint8_t>( 586 legacy_scan_result.ssid, 587 legacy_scan_result.ssid + strnlen(legacy_scan_result.ssid, 588 sizeof(legacy_scan_result.ssid) - 1)); 589 memcpy(hidl_scan_result->bssid.data(), legacy_scan_result.bssid, 590 hidl_scan_result->bssid.size()); 591 hidl_scan_result->frequency = legacy_scan_result.channel; 592 hidl_scan_result->rssi = legacy_scan_result.rssi; 593 hidl_scan_result->beaconPeriodInMs = legacy_scan_result.beacon_period; 594 hidl_scan_result->capability = legacy_scan_result.capability; 595 if (has_ie_data) { 596 std::vector<WifiInformationElement> ies; 597 if (!convertLegacyIeBlobToHidl( 598 reinterpret_cast<const uint8_t*>(legacy_scan_result.ie_data), 599 legacy_scan_result.ie_length, &ies)) { 600 return false; 601 } 602 hidl_scan_result->informationElements = std::move(ies); 603 } 604 return true; 605 } 606 607 bool convertLegacyCachedGscanResultsToHidl( 608 const legacy_hal::wifi_cached_scan_results& legacy_cached_scan_result, 609 StaScanData* hidl_scan_data) { 610 if (!hidl_scan_data) { 611 return false; 612 } 613 *hidl_scan_data = {}; 614 hidl_scan_data->flags = 0; 615 for (const auto flag : {legacy_hal::WIFI_SCAN_FLAG_INTERRUPTED}) { 616 if (legacy_cached_scan_result.flags & flag) { 617 hidl_scan_data->flags |= 618 static_cast<std::underlying_type<StaScanDataFlagMask>::type>( 619 convertLegacyGscanDataFlagToHidl(flag)); 620 } 621 } 622 hidl_scan_data->bucketsScanned = legacy_cached_scan_result.buckets_scanned; 623 624 CHECK(legacy_cached_scan_result.num_results >= 0 && 625 legacy_cached_scan_result.num_results <= MAX_AP_CACHE_PER_SCAN); 626 std::vector<StaScanResult> hidl_scan_results; 627 for (int32_t result_idx = 0; 628 result_idx < legacy_cached_scan_result.num_results; result_idx++) { 629 StaScanResult hidl_scan_result; 630 if (!convertLegacyGscanResultToHidl( 631 legacy_cached_scan_result.results[result_idx], false, 632 &hidl_scan_result)) { 633 return false; 634 } 635 hidl_scan_results.push_back(hidl_scan_result); 636 } 637 hidl_scan_data->results = std::move(hidl_scan_results); 638 return true; 639 } 640 641 bool convertLegacyVectorOfCachedGscanResultsToHidl( 642 const std::vector<legacy_hal::wifi_cached_scan_results>& 643 legacy_cached_scan_results, 644 std::vector<StaScanData>* hidl_scan_datas) { 645 if (!hidl_scan_datas) { 646 return false; 647 } 648 *hidl_scan_datas = {}; 649 for (const auto& legacy_cached_scan_result : legacy_cached_scan_results) { 650 StaScanData hidl_scan_data; 651 if (!convertLegacyCachedGscanResultsToHidl(legacy_cached_scan_result, 652 &hidl_scan_data)) { 653 return false; 654 } 655 hidl_scan_datas->push_back(hidl_scan_data); 656 } 657 return true; 658 } 659 660 WifiDebugTxPacketFate convertLegacyDebugTxPacketFateToHidl( 661 legacy_hal::wifi_tx_packet_fate fate) { 662 switch (fate) { 663 case legacy_hal::TX_PKT_FATE_ACKED: 664 return WifiDebugTxPacketFate::ACKED; 665 case legacy_hal::TX_PKT_FATE_SENT: 666 return WifiDebugTxPacketFate::SENT; 667 case legacy_hal::TX_PKT_FATE_FW_QUEUED: 668 return WifiDebugTxPacketFate::FW_QUEUED; 669 case legacy_hal::TX_PKT_FATE_FW_DROP_INVALID: 670 return WifiDebugTxPacketFate::FW_DROP_INVALID; 671 case legacy_hal::TX_PKT_FATE_FW_DROP_NOBUFS: 672 return WifiDebugTxPacketFate::FW_DROP_NOBUFS; 673 case legacy_hal::TX_PKT_FATE_FW_DROP_OTHER: 674 return WifiDebugTxPacketFate::FW_DROP_OTHER; 675 case legacy_hal::TX_PKT_FATE_DRV_QUEUED: 676 return WifiDebugTxPacketFate::DRV_QUEUED; 677 case legacy_hal::TX_PKT_FATE_DRV_DROP_INVALID: 678 return WifiDebugTxPacketFate::DRV_DROP_INVALID; 679 case legacy_hal::TX_PKT_FATE_DRV_DROP_NOBUFS: 680 return WifiDebugTxPacketFate::DRV_DROP_NOBUFS; 681 case legacy_hal::TX_PKT_FATE_DRV_DROP_OTHER: 682 return WifiDebugTxPacketFate::DRV_DROP_OTHER; 683 }; 684 CHECK(false) << "Unknown legacy fate type: " << fate; 685 } 686 687 WifiDebugRxPacketFate convertLegacyDebugRxPacketFateToHidl( 688 legacy_hal::wifi_rx_packet_fate fate) { 689 switch (fate) { 690 case legacy_hal::RX_PKT_FATE_SUCCESS: 691 return WifiDebugRxPacketFate::SUCCESS; 692 case legacy_hal::RX_PKT_FATE_FW_QUEUED: 693 return WifiDebugRxPacketFate::FW_QUEUED; 694 case legacy_hal::RX_PKT_FATE_FW_DROP_FILTER: 695 return WifiDebugRxPacketFate::FW_DROP_FILTER; 696 case legacy_hal::RX_PKT_FATE_FW_DROP_INVALID: 697 return WifiDebugRxPacketFate::FW_DROP_INVALID; 698 case legacy_hal::RX_PKT_FATE_FW_DROP_NOBUFS: 699 return WifiDebugRxPacketFate::FW_DROP_NOBUFS; 700 case legacy_hal::RX_PKT_FATE_FW_DROP_OTHER: 701 return WifiDebugRxPacketFate::FW_DROP_OTHER; 702 case legacy_hal::RX_PKT_FATE_DRV_QUEUED: 703 return WifiDebugRxPacketFate::DRV_QUEUED; 704 case legacy_hal::RX_PKT_FATE_DRV_DROP_FILTER: 705 return WifiDebugRxPacketFate::DRV_DROP_FILTER; 706 case legacy_hal::RX_PKT_FATE_DRV_DROP_INVALID: 707 return WifiDebugRxPacketFate::DRV_DROP_INVALID; 708 case legacy_hal::RX_PKT_FATE_DRV_DROP_NOBUFS: 709 return WifiDebugRxPacketFate::DRV_DROP_NOBUFS; 710 case legacy_hal::RX_PKT_FATE_DRV_DROP_OTHER: 711 return WifiDebugRxPacketFate::DRV_DROP_OTHER; 712 }; 713 CHECK(false) << "Unknown legacy fate type: " << fate; 714 } 715 716 WifiDebugPacketFateFrameType convertLegacyDebugPacketFateFrameTypeToHidl( 717 legacy_hal::frame_type type) { 718 switch (type) { 719 case legacy_hal::FRAME_TYPE_UNKNOWN: 720 return WifiDebugPacketFateFrameType::UNKNOWN; 721 case legacy_hal::FRAME_TYPE_ETHERNET_II: 722 return WifiDebugPacketFateFrameType::ETHERNET_II; 723 case legacy_hal::FRAME_TYPE_80211_MGMT: 724 return WifiDebugPacketFateFrameType::MGMT_80211; 725 }; 726 CHECK(false) << "Unknown legacy frame type: " << type; 727 } 728 729 bool convertLegacyDebugPacketFateFrameToHidl( 730 const legacy_hal::frame_info& legacy_frame, 731 WifiDebugPacketFateFrameInfo* hidl_frame) { 732 if (!hidl_frame) { 733 return false; 734 } 735 *hidl_frame = {}; 736 hidl_frame->frameType = 737 convertLegacyDebugPacketFateFrameTypeToHidl(legacy_frame.payload_type); 738 hidl_frame->frameLen = legacy_frame.frame_len; 739 hidl_frame->driverTimestampUsec = legacy_frame.driver_timestamp_usec; 740 hidl_frame->firmwareTimestampUsec = legacy_frame.firmware_timestamp_usec; 741 const uint8_t* frame_begin = reinterpret_cast<const uint8_t*>( 742 legacy_frame.frame_content.ethernet_ii_bytes); 743 hidl_frame->frameContent = 744 std::vector<uint8_t>(frame_begin, frame_begin + legacy_frame.frame_len); 745 return true; 746 } 747 748 bool convertLegacyDebugTxPacketFateToHidl( 749 const legacy_hal::wifi_tx_report& legacy_fate, 750 WifiDebugTxPacketFateReport* hidl_fate) { 751 if (!hidl_fate) { 752 return false; 753 } 754 *hidl_fate = {}; 755 hidl_fate->fate = convertLegacyDebugTxPacketFateToHidl(legacy_fate.fate); 756 return convertLegacyDebugPacketFateFrameToHidl(legacy_fate.frame_inf, 757 &hidl_fate->frameInfo); 758 } 759 760 bool convertLegacyVectorOfDebugTxPacketFateToHidl( 761 const std::vector<legacy_hal::wifi_tx_report>& legacy_fates, 762 std::vector<WifiDebugTxPacketFateReport>* hidl_fates) { 763 if (!hidl_fates) { 764 return false; 765 } 766 *hidl_fates = {}; 767 for (const auto& legacy_fate : legacy_fates) { 768 WifiDebugTxPacketFateReport hidl_fate; 769 if (!convertLegacyDebugTxPacketFateToHidl(legacy_fate, &hidl_fate)) { 770 return false; 771 } 772 hidl_fates->push_back(hidl_fate); 773 } 774 return true; 775 } 776 777 bool convertLegacyDebugRxPacketFateToHidl( 778 const legacy_hal::wifi_rx_report& legacy_fate, 779 WifiDebugRxPacketFateReport* hidl_fate) { 780 if (!hidl_fate) { 781 return false; 782 } 783 *hidl_fate = {}; 784 hidl_fate->fate = convertLegacyDebugRxPacketFateToHidl(legacy_fate.fate); 785 return convertLegacyDebugPacketFateFrameToHidl(legacy_fate.frame_inf, 786 &hidl_fate->frameInfo); 787 } 788 789 bool convertLegacyVectorOfDebugRxPacketFateToHidl( 790 const std::vector<legacy_hal::wifi_rx_report>& legacy_fates, 791 std::vector<WifiDebugRxPacketFateReport>* hidl_fates) { 792 if (!hidl_fates) { 793 return false; 794 } 795 *hidl_fates = {}; 796 for (const auto& legacy_fate : legacy_fates) { 797 WifiDebugRxPacketFateReport hidl_fate; 798 if (!convertLegacyDebugRxPacketFateToHidl(legacy_fate, &hidl_fate)) { 799 return false; 800 } 801 hidl_fates->push_back(hidl_fate); 802 } 803 return true; 804 } 805 806 bool convertLegacyLinkLayerRadioStatsToHidl( 807 const legacy_hal::LinkLayerRadioStats& legacy_radio_stat, 808 V1_3::StaLinkLayerRadioStats* hidl_radio_stat) { 809 if (!hidl_radio_stat) { 810 return false; 811 } 812 *hidl_radio_stat = {}; 813 814 hidl_radio_stat->V1_0.onTimeInMs = legacy_radio_stat.stats.on_time; 815 hidl_radio_stat->V1_0.txTimeInMs = legacy_radio_stat.stats.tx_time; 816 hidl_radio_stat->V1_0.rxTimeInMs = legacy_radio_stat.stats.rx_time; 817 hidl_radio_stat->V1_0.onTimeInMsForScan = 818 legacy_radio_stat.stats.on_time_scan; 819 hidl_radio_stat->V1_0.txTimeInMsPerLevel = 820 legacy_radio_stat.tx_time_per_levels; 821 hidl_radio_stat->onTimeInMsForNanScan = legacy_radio_stat.stats.on_time_nbd; 822 hidl_radio_stat->onTimeInMsForBgScan = 823 legacy_radio_stat.stats.on_time_gscan; 824 hidl_radio_stat->onTimeInMsForRoamScan = 825 legacy_radio_stat.stats.on_time_roam_scan; 826 hidl_radio_stat->onTimeInMsForPnoScan = 827 legacy_radio_stat.stats.on_time_pno_scan; 828 hidl_radio_stat->onTimeInMsForHs20Scan = 829 legacy_radio_stat.stats.on_time_hs20; 830 831 std::vector<V1_3::WifiChannelStats> hidl_channel_stats; 832 833 for (const auto& channel_stat : legacy_radio_stat.channel_stats) { 834 V1_3::WifiChannelStats hidl_channel_stat; 835 hidl_channel_stat.onTimeInMs = channel_stat.on_time; 836 hidl_channel_stat.ccaBusyTimeInMs = channel_stat.cca_busy_time; 837 /* 838 * TODO once b/119142899 is fixed, 839 * replace below code with convertLegacyWifiChannelInfoToHidl() 840 */ 841 hidl_channel_stat.channel.width = WifiChannelWidthInMhz::WIDTH_20; 842 hidl_channel_stat.channel.centerFreq = channel_stat.channel.center_freq; 843 hidl_channel_stat.channel.centerFreq0 = 844 channel_stat.channel.center_freq0; 845 hidl_channel_stat.channel.centerFreq1 = 846 channel_stat.channel.center_freq1; 847 hidl_channel_stats.push_back(hidl_channel_stat); 848 } 849 850 hidl_radio_stat->channelStats = hidl_channel_stats; 851 852 return true; 853 } 854 855 bool convertLegacyLinkLayerStatsToHidl( 856 const legacy_hal::LinkLayerStats& legacy_stats, 857 V1_3::StaLinkLayerStats* hidl_stats) { 858 if (!hidl_stats) { 859 return false; 860 } 861 *hidl_stats = {}; 862 // iface legacy_stats conversion. 863 hidl_stats->iface.beaconRx = legacy_stats.iface.beacon_rx; 864 hidl_stats->iface.avgRssiMgmt = legacy_stats.iface.rssi_mgmt; 865 hidl_stats->iface.wmeBePktStats.rxMpdu = 866 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].rx_mpdu; 867 hidl_stats->iface.wmeBePktStats.txMpdu = 868 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].tx_mpdu; 869 hidl_stats->iface.wmeBePktStats.lostMpdu = 870 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].mpdu_lost; 871 hidl_stats->iface.wmeBePktStats.retries = 872 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].retries; 873 hidl_stats->iface.wmeBkPktStats.rxMpdu = 874 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].rx_mpdu; 875 hidl_stats->iface.wmeBkPktStats.txMpdu = 876 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].tx_mpdu; 877 hidl_stats->iface.wmeBkPktStats.lostMpdu = 878 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].mpdu_lost; 879 hidl_stats->iface.wmeBkPktStats.retries = 880 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].retries; 881 hidl_stats->iface.wmeViPktStats.rxMpdu = 882 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].rx_mpdu; 883 hidl_stats->iface.wmeViPktStats.txMpdu = 884 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].tx_mpdu; 885 hidl_stats->iface.wmeViPktStats.lostMpdu = 886 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].mpdu_lost; 887 hidl_stats->iface.wmeViPktStats.retries = 888 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].retries; 889 hidl_stats->iface.wmeVoPktStats.rxMpdu = 890 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].rx_mpdu; 891 hidl_stats->iface.wmeVoPktStats.txMpdu = 892 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].tx_mpdu; 893 hidl_stats->iface.wmeVoPktStats.lostMpdu = 894 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].mpdu_lost; 895 hidl_stats->iface.wmeVoPktStats.retries = 896 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].retries; 897 // radio legacy_stats conversion. 898 std::vector<V1_3::StaLinkLayerRadioStats> hidl_radios_stats; 899 for (const auto& legacy_radio_stats : legacy_stats.radios) { 900 V1_3::StaLinkLayerRadioStats hidl_radio_stats; 901 if (!convertLegacyLinkLayerRadioStatsToHidl(legacy_radio_stats, 902 &hidl_radio_stats)) { 903 return false; 904 } 905 hidl_radios_stats.push_back(hidl_radio_stats); 906 } 907 hidl_stats->radios = hidl_radios_stats; 908 // Timestamp in the HAL wrapper here since it's not provided in the legacy 909 // HAL API. 910 hidl_stats->timeStampInMs = uptimeMillis(); 911 return true; 912 } 913 914 bool convertLegacyRoamingCapabilitiesToHidl( 915 const legacy_hal::wifi_roaming_capabilities& legacy_caps, 916 StaRoamingCapabilities* hidl_caps) { 917 if (!hidl_caps) { 918 return false; 919 } 920 *hidl_caps = {}; 921 hidl_caps->maxBlacklistSize = legacy_caps.max_blacklist_size; 922 hidl_caps->maxWhitelistSize = legacy_caps.max_whitelist_size; 923 return true; 924 } 925 926 bool convertHidlRoamingConfigToLegacy( 927 const StaRoamingConfig& hidl_config, 928 legacy_hal::wifi_roaming_config* legacy_config) { 929 if (!legacy_config) { 930 return false; 931 } 932 *legacy_config = {}; 933 if (hidl_config.bssidBlacklist.size() > MAX_BLACKLIST_BSSID || 934 hidl_config.ssidWhitelist.size() > MAX_WHITELIST_SSID) { 935 return false; 936 } 937 legacy_config->num_blacklist_bssid = hidl_config.bssidBlacklist.size(); 938 uint32_t i = 0; 939 for (const auto& bssid : hidl_config.bssidBlacklist) { 940 CHECK(bssid.size() == sizeof(legacy_hal::mac_addr)); 941 memcpy(legacy_config->blacklist_bssid[i++], bssid.data(), bssid.size()); 942 } 943 legacy_config->num_whitelist_ssid = hidl_config.ssidWhitelist.size(); 944 i = 0; 945 for (const auto& ssid : hidl_config.ssidWhitelist) { 946 CHECK(ssid.size() <= sizeof(legacy_hal::ssid_t::ssid_str)); 947 legacy_config->whitelist_ssid[i].length = ssid.size(); 948 memcpy(legacy_config->whitelist_ssid[i].ssid_str, ssid.data(), 949 ssid.size()); 950 i++; 951 } 952 return true; 953 } 954 955 legacy_hal::fw_roaming_state_t convertHidlRoamingStateToLegacy( 956 StaRoamingState state) { 957 switch (state) { 958 case StaRoamingState::ENABLED: 959 return legacy_hal::ROAMING_ENABLE; 960 case StaRoamingState::DISABLED: 961 return legacy_hal::ROAMING_DISABLE; 962 }; 963 CHECK(false); 964 } 965 966 legacy_hal::NanMatchAlg convertHidlNanMatchAlgToLegacy(NanMatchAlg type) { 967 switch (type) { 968 case NanMatchAlg::MATCH_ONCE: 969 return legacy_hal::NAN_MATCH_ALG_MATCH_ONCE; 970 case NanMatchAlg::MATCH_CONTINUOUS: 971 return legacy_hal::NAN_MATCH_ALG_MATCH_CONTINUOUS; 972 case NanMatchAlg::MATCH_NEVER: 973 return legacy_hal::NAN_MATCH_ALG_MATCH_NEVER; 974 } 975 CHECK(false); 976 } 977 978 legacy_hal::NanPublishType convertHidlNanPublishTypeToLegacy( 979 NanPublishType type) { 980 switch (type) { 981 case NanPublishType::UNSOLICITED: 982 return legacy_hal::NAN_PUBLISH_TYPE_UNSOLICITED; 983 case NanPublishType::SOLICITED: 984 return legacy_hal::NAN_PUBLISH_TYPE_SOLICITED; 985 case NanPublishType::UNSOLICITED_SOLICITED: 986 return legacy_hal::NAN_PUBLISH_TYPE_UNSOLICITED_SOLICITED; 987 } 988 CHECK(false); 989 } 990 991 legacy_hal::NanTxType convertHidlNanTxTypeToLegacy(NanTxType type) { 992 switch (type) { 993 case NanTxType::BROADCAST: 994 return legacy_hal::NAN_TX_TYPE_BROADCAST; 995 case NanTxType::UNICAST: 996 return legacy_hal::NAN_TX_TYPE_UNICAST; 997 } 998 CHECK(false); 999 } 1000 1001 legacy_hal::NanSubscribeType convertHidlNanSubscribeTypeToLegacy( 1002 NanSubscribeType type) { 1003 switch (type) { 1004 case NanSubscribeType::PASSIVE: 1005 return legacy_hal::NAN_SUBSCRIBE_TYPE_PASSIVE; 1006 case NanSubscribeType::ACTIVE: 1007 return legacy_hal::NAN_SUBSCRIBE_TYPE_ACTIVE; 1008 } 1009 CHECK(false); 1010 } 1011 1012 legacy_hal::NanSRFType convertHidlNanSrfTypeToLegacy(NanSrfType type) { 1013 switch (type) { 1014 case NanSrfType::BLOOM_FILTER: 1015 return legacy_hal::NAN_SRF_ATTR_BLOOM_FILTER; 1016 case NanSrfType::PARTIAL_MAC_ADDR: 1017 return legacy_hal::NAN_SRF_ATTR_PARTIAL_MAC_ADDR; 1018 } 1019 CHECK(false); 1020 } 1021 1022 legacy_hal::NanDataPathChannelCfg convertHidlNanDataPathChannelCfgToLegacy( 1023 NanDataPathChannelCfg type) { 1024 switch (type) { 1025 case NanDataPathChannelCfg::CHANNEL_NOT_REQUESTED: 1026 return legacy_hal::NAN_DP_CHANNEL_NOT_REQUESTED; 1027 case NanDataPathChannelCfg::REQUEST_CHANNEL_SETUP: 1028 return legacy_hal::NAN_DP_REQUEST_CHANNEL_SETUP; 1029 case NanDataPathChannelCfg::FORCE_CHANNEL_SETUP: 1030 return legacy_hal::NAN_DP_FORCE_CHANNEL_SETUP; 1031 } 1032 CHECK(false); 1033 } 1034 1035 NanStatusType convertLegacyNanStatusTypeToHidl(legacy_hal::NanStatusType type) { 1036 switch (type) { 1037 case legacy_hal::NAN_STATUS_SUCCESS: 1038 return NanStatusType::SUCCESS; 1039 case legacy_hal::NAN_STATUS_INTERNAL_FAILURE: 1040 return NanStatusType::INTERNAL_FAILURE; 1041 case legacy_hal::NAN_STATUS_PROTOCOL_FAILURE: 1042 return NanStatusType::PROTOCOL_FAILURE; 1043 case legacy_hal::NAN_STATUS_INVALID_PUBLISH_SUBSCRIBE_ID: 1044 return NanStatusType::INVALID_SESSION_ID; 1045 case legacy_hal::NAN_STATUS_NO_RESOURCE_AVAILABLE: 1046 return NanStatusType::NO_RESOURCES_AVAILABLE; 1047 case legacy_hal::NAN_STATUS_INVALID_PARAM: 1048 return NanStatusType::INVALID_ARGS; 1049 case legacy_hal::NAN_STATUS_INVALID_REQUESTOR_INSTANCE_ID: 1050 return NanStatusType::INVALID_PEER_ID; 1051 case legacy_hal::NAN_STATUS_INVALID_NDP_ID: 1052 return NanStatusType::INVALID_NDP_ID; 1053 case legacy_hal::NAN_STATUS_NAN_NOT_ALLOWED: 1054 return NanStatusType::NAN_NOT_ALLOWED; 1055 case legacy_hal::NAN_STATUS_NO_OTA_ACK: 1056 return NanStatusType::NO_OTA_ACK; 1057 case legacy_hal::NAN_STATUS_ALREADY_ENABLED: 1058 return NanStatusType::ALREADY_ENABLED; 1059 case legacy_hal::NAN_STATUS_FOLLOWUP_QUEUE_FULL: 1060 return NanStatusType::FOLLOWUP_TX_QUEUE_FULL; 1061 case legacy_hal::NAN_STATUS_UNSUPPORTED_CONCURRENCY_NAN_DISABLED: 1062 return NanStatusType::UNSUPPORTED_CONCURRENCY_NAN_DISABLED; 1063 } 1064 CHECK(false); 1065 } 1066 1067 void convertToWifiNanStatus(legacy_hal::NanStatusType type, const char* str, 1068 size_t max_len, WifiNanStatus* wifiNanStatus) { 1069 wifiNanStatus->status = convertLegacyNanStatusTypeToHidl(type); 1070 wifiNanStatus->description = safeConvertChar(str, max_len); 1071 } 1072 1073 bool convertHidlNanEnableRequestToLegacy( 1074 const NanEnableRequest& hidl_request, 1075 legacy_hal::NanEnableRequest* legacy_request) { 1076 if (!legacy_request) { 1077 LOG(ERROR) 1078 << "convertHidlNanEnableRequestToLegacy: null legacy_request"; 1079 return false; 1080 } 1081 *legacy_request = {}; 1082 1083 legacy_request->config_2dot4g_support = 1; 1084 legacy_request->support_2dot4g_val = 1085 hidl_request.operateInBand[(size_t)NanBandIndex::NAN_BAND_24GHZ]; 1086 legacy_request->config_support_5g = 1; 1087 legacy_request->support_5g_val = 1088 hidl_request.operateInBand[(size_t)NanBandIndex::NAN_BAND_5GHZ]; 1089 legacy_request->config_hop_count_limit = 1; 1090 legacy_request->hop_count_limit_val = hidl_request.hopCountMax; 1091 legacy_request->master_pref = hidl_request.configParams.masterPref; 1092 legacy_request->discovery_indication_cfg = 0; 1093 legacy_request->discovery_indication_cfg |= 1094 hidl_request.configParams.disableDiscoveryAddressChangeIndication ? 0x1 1095 : 0x0; 1096 legacy_request->discovery_indication_cfg |= 1097 hidl_request.configParams.disableStartedClusterIndication ? 0x2 : 0x0; 1098 legacy_request->discovery_indication_cfg |= 1099 hidl_request.configParams.disableJoinedClusterIndication ? 0x4 : 0x0; 1100 legacy_request->config_sid_beacon = 1; 1101 if (hidl_request.configParams.numberOfPublishServiceIdsInBeacon > 127) { 1102 LOG(ERROR) << "convertHidlNanEnableRequestToLegacy: " 1103 "numberOfPublishServiceIdsInBeacon > 127"; 1104 return false; 1105 } 1106 legacy_request->sid_beacon_val = 1107 (hidl_request.configParams.includePublishServiceIdsInBeacon ? 0x1 1108 : 0x0) | 1109 (hidl_request.configParams.numberOfPublishServiceIdsInBeacon << 1); 1110 legacy_request->config_subscribe_sid_beacon = 1; 1111 if (hidl_request.configParams.numberOfSubscribeServiceIdsInBeacon > 127) { 1112 LOG(ERROR) << "convertHidlNanEnableRequestToLegacy: " 1113 "numberOfSubscribeServiceIdsInBeacon > 127"; 1114 return false; 1115 } 1116 legacy_request->subscribe_sid_beacon_val = 1117 (hidl_request.configParams.includeSubscribeServiceIdsInBeacon ? 0x1 1118 : 0x0) | 1119 (hidl_request.configParams.numberOfSubscribeServiceIdsInBeacon << 1); 1120 legacy_request->config_rssi_window_size = 1; 1121 legacy_request->rssi_window_size_val = 1122 hidl_request.configParams.rssiWindowSize; 1123 legacy_request->config_disc_mac_addr_randomization = 1; 1124 legacy_request->disc_mac_addr_rand_interval_sec = 1125 hidl_request.configParams.macAddressRandomizationIntervalSec; 1126 legacy_request->config_2dot4g_rssi_close = 1; 1127 if (hidl_request.configParams.bandSpecificConfig.size() != 2) { 1128 LOG(ERROR) << "convertHidlNanEnableRequestToLegacy: " 1129 "bandSpecificConfig.size() != 2"; 1130 return false; 1131 } 1132 legacy_request->rssi_close_2dot4g_val = 1133 hidl_request.configParams 1134 .bandSpecificConfig[(size_t)NanBandIndex::NAN_BAND_24GHZ] 1135 .rssiClose; 1136 legacy_request->config_2dot4g_rssi_middle = 1; 1137 legacy_request->rssi_middle_2dot4g_val = 1138 hidl_request.configParams 1139 .bandSpecificConfig[(size_t)NanBandIndex::NAN_BAND_24GHZ] 1140 .rssiMiddle; 1141 legacy_request->config_2dot4g_rssi_proximity = 1; 1142 legacy_request->rssi_proximity_2dot4g_val = 1143 hidl_request.configParams 1144 .bandSpecificConfig[(size_t)NanBandIndex::NAN_BAND_24GHZ] 1145 .rssiCloseProximity; 1146 legacy_request->config_scan_params = 1; 1147 legacy_request->scan_params_val 1148 .dwell_time[legacy_hal::NAN_CHANNEL_24G_BAND] = 1149 hidl_request.configParams 1150 .bandSpecificConfig[(size_t)NanBandIndex::NAN_BAND_24GHZ] 1151 .dwellTimeMs; 1152 legacy_request->scan_params_val 1153 .scan_period[legacy_hal::NAN_CHANNEL_24G_BAND] = 1154 hidl_request.configParams 1155 .bandSpecificConfig[(size_t)NanBandIndex::NAN_BAND_24GHZ] 1156 .scanPeriodSec; 1157 legacy_request->config_dw.config_2dot4g_dw_band = 1158 hidl_request.configParams 1159 .bandSpecificConfig[(size_t)NanBandIndex::NAN_BAND_24GHZ] 1160 .validDiscoveryWindowIntervalVal; 1161 legacy_request->config_dw.dw_2dot4g_interval_val = 1162 hidl_request.configParams 1163 .bandSpecificConfig[(size_t)NanBandIndex::NAN_BAND_24GHZ] 1164 .discoveryWindowIntervalVal; 1165 legacy_request->config_5g_rssi_close = 1; 1166 legacy_request->rssi_close_5g_val = 1167 hidl_request.configParams 1168 .bandSpecificConfig[(size_t)NanBandIndex::NAN_BAND_5GHZ] 1169 .rssiClose; 1170 legacy_request->config_5g_rssi_middle = 1; 1171 legacy_request->rssi_middle_5g_val = 1172 hidl_request.configParams 1173 .bandSpecificConfig[(size_t)NanBandIndex::NAN_BAND_5GHZ] 1174 .rssiMiddle; 1175 legacy_request->config_5g_rssi_close_proximity = 1; 1176 legacy_request->rssi_close_proximity_5g_val = 1177 hidl_request.configParams 1178 .bandSpecificConfig[(size_t)NanBandIndex::NAN_BAND_5GHZ] 1179 .rssiCloseProximity; 1180 legacy_request->scan_params_val 1181 .dwell_time[legacy_hal::NAN_CHANNEL_5G_BAND_LOW] = 1182 hidl_request.configParams 1183 .bandSpecificConfig[(size_t)NanBandIndex::NAN_BAND_5GHZ] 1184 .dwellTimeMs; 1185 legacy_request->scan_params_val 1186 .scan_period[legacy_hal::NAN_CHANNEL_5G_BAND_LOW] = 1187 hidl_request.configParams 1188 .bandSpecificConfig[(size_t)NanBandIndex::NAN_BAND_5GHZ] 1189 .scanPeriodSec; 1190 legacy_request->scan_params_val 1191 .dwell_time[legacy_hal::NAN_CHANNEL_5G_BAND_HIGH] = 1192 hidl_request.configParams 1193 .bandSpecificConfig[(size_t)NanBandIndex::NAN_BAND_5GHZ] 1194 .dwellTimeMs; 1195 legacy_request->scan_params_val 1196 .scan_period[legacy_hal::NAN_CHANNEL_5G_BAND_HIGH] = 1197 hidl_request.configParams 1198 .bandSpecificConfig[(size_t)NanBandIndex::NAN_BAND_5GHZ] 1199 .scanPeriodSec; 1200 legacy_request->config_dw.config_5g_dw_band = 1201 hidl_request.configParams 1202 .bandSpecificConfig[(size_t)NanBandIndex::NAN_BAND_5GHZ] 1203 .validDiscoveryWindowIntervalVal; 1204 legacy_request->config_dw.dw_5g_interval_val = 1205 hidl_request.configParams 1206 .bandSpecificConfig[(size_t)NanBandIndex::NAN_BAND_5GHZ] 1207 .discoveryWindowIntervalVal; 1208 if (hidl_request.debugConfigs.validClusterIdVals) { 1209 legacy_request->cluster_low = 1210 hidl_request.debugConfigs.clusterIdBottomRangeVal; 1211 legacy_request->cluster_high = 1212 hidl_request.debugConfigs.clusterIdTopRangeVal; 1213 } else { // need 'else' since not configurable in legacy HAL 1214 legacy_request->cluster_low = 0x0000; 1215 legacy_request->cluster_high = 0xFFFF; 1216 } 1217 legacy_request->config_intf_addr = 1218 hidl_request.debugConfigs.validIntfAddrVal; 1219 memcpy(legacy_request->intf_addr_val, 1220 hidl_request.debugConfigs.intfAddrVal.data(), 6); 1221 legacy_request->config_oui = hidl_request.debugConfigs.validOuiVal; 1222 legacy_request->oui_val = hidl_request.debugConfigs.ouiVal; 1223 legacy_request->config_random_factor_force = 1224 hidl_request.debugConfigs.validRandomFactorForceVal; 1225 legacy_request->random_factor_force_val = 1226 hidl_request.debugConfigs.randomFactorForceVal; 1227 legacy_request->config_hop_count_force = 1228 hidl_request.debugConfigs.validHopCountForceVal; 1229 legacy_request->hop_count_force_val = 1230 hidl_request.debugConfigs.hopCountForceVal; 1231 legacy_request->config_24g_channel = 1232 hidl_request.debugConfigs.validDiscoveryChannelVal; 1233 legacy_request->channel_24g_val = 1234 hidl_request.debugConfigs 1235 .discoveryChannelMhzVal[(size_t)NanBandIndex::NAN_BAND_24GHZ]; 1236 legacy_request->config_5g_channel = 1237 hidl_request.debugConfigs.validDiscoveryChannelVal; 1238 legacy_request->channel_5g_val = 1239 hidl_request.debugConfigs 1240 .discoveryChannelMhzVal[(size_t)NanBandIndex::NAN_BAND_5GHZ]; 1241 legacy_request->config_2dot4g_beacons = 1242 hidl_request.debugConfigs.validUseBeaconsInBandVal; 1243 legacy_request->beacon_2dot4g_val = 1244 hidl_request.debugConfigs 1245 .useBeaconsInBandVal[(size_t)NanBandIndex::NAN_BAND_24GHZ]; 1246 legacy_request->config_5g_beacons = 1247 hidl_request.debugConfigs.validUseBeaconsInBandVal; 1248 legacy_request->beacon_5g_val = 1249 hidl_request.debugConfigs 1250 .useBeaconsInBandVal[(size_t)NanBandIndex::NAN_BAND_5GHZ]; 1251 legacy_request->config_2dot4g_sdf = 1252 hidl_request.debugConfigs.validUseSdfInBandVal; 1253 legacy_request->sdf_2dot4g_val = 1254 hidl_request.debugConfigs 1255 .useSdfInBandVal[(size_t)NanBandIndex::NAN_BAND_24GHZ]; 1256 legacy_request->config_5g_sdf = 1257 hidl_request.debugConfigs.validUseSdfInBandVal; 1258 legacy_request->sdf_5g_val = 1259 hidl_request.debugConfigs 1260 .useSdfInBandVal[(size_t)NanBandIndex::NAN_BAND_5GHZ]; 1261 1262 return true; 1263 } 1264 1265 bool convertHidlNanEnableRequest_1_2ToLegacy( 1266 const NanEnableRequest& hidl_request1, 1267 const V1_2::NanConfigRequestSupplemental& hidl_request2, 1268 legacy_hal::NanEnableRequest* legacy_request) { 1269 if (!legacy_request) { 1270 LOG(ERROR) 1271 << "convertHidlNanEnableRequest_1_2ToLegacy: null legacy_request"; 1272 return false; 1273 } 1274 1275 *legacy_request = {}; 1276 if (!convertHidlNanEnableRequestToLegacy(hidl_request1, legacy_request)) { 1277 return false; 1278 } 1279 1280 legacy_request->config_discovery_beacon_int = 1; 1281 legacy_request->discovery_beacon_interval = 1282 hidl_request2.discoveryBeaconIntervalMs; 1283 legacy_request->config_nss = 1; 1284 legacy_request->nss = hidl_request2.numberOfSpatialStreamsInDiscovery; 1285 legacy_request->config_dw_early_termination = 1; 1286 legacy_request->enable_dw_termination = 1287 hidl_request2.enableDiscoveryWindowEarlyTermination; 1288 legacy_request->config_enable_ranging = 1; 1289 legacy_request->enable_ranging = hidl_request2.enableRanging; 1290 1291 return true; 1292 } 1293 1294 bool convertHidlNanPublishRequestToLegacy( 1295 const NanPublishRequest& hidl_request, 1296 legacy_hal::NanPublishRequest* legacy_request) { 1297 if (!legacy_request) { 1298 LOG(ERROR) 1299 << "convertHidlNanPublishRequestToLegacy: null legacy_request"; 1300 return false; 1301 } 1302 *legacy_request = {}; 1303 1304 legacy_request->publish_id = hidl_request.baseConfigs.sessionId; 1305 legacy_request->ttl = hidl_request.baseConfigs.ttlSec; 1306 legacy_request->period = hidl_request.baseConfigs.discoveryWindowPeriod; 1307 legacy_request->publish_count = hidl_request.baseConfigs.discoveryCount; 1308 legacy_request->service_name_len = 1309 hidl_request.baseConfigs.serviceName.size(); 1310 if (legacy_request->service_name_len > NAN_MAX_SERVICE_NAME_LEN) { 1311 LOG(ERROR) << "convertHidlNanPublishRequestToLegacy: service_name_len " 1312 "too large"; 1313 return false; 1314 } 1315 memcpy(legacy_request->service_name, 1316 hidl_request.baseConfigs.serviceName.data(), 1317 legacy_request->service_name_len); 1318 legacy_request->publish_match_indicator = convertHidlNanMatchAlgToLegacy( 1319 hidl_request.baseConfigs.discoveryMatchIndicator); 1320 legacy_request->service_specific_info_len = 1321 hidl_request.baseConfigs.serviceSpecificInfo.size(); 1322 if (legacy_request->service_specific_info_len > 1323 NAN_MAX_SERVICE_SPECIFIC_INFO_LEN) { 1324 LOG(ERROR) << "convertHidlNanPublishRequestToLegacy: " 1325 "service_specific_info_len too large"; 1326 return false; 1327 } 1328 memcpy(legacy_request->service_specific_info, 1329 hidl_request.baseConfigs.serviceSpecificInfo.data(), 1330 legacy_request->service_specific_info_len); 1331 legacy_request->sdea_service_specific_info_len = 1332 hidl_request.baseConfigs.extendedServiceSpecificInfo.size(); 1333 if (legacy_request->sdea_service_specific_info_len > 1334 NAN_MAX_SDEA_SERVICE_SPECIFIC_INFO_LEN) { 1335 LOG(ERROR) << "convertHidlNanPublishRequestToLegacy: " 1336 "sdea_service_specific_info_len too large"; 1337 return false; 1338 } 1339 memcpy(legacy_request->sdea_service_specific_info, 1340 hidl_request.baseConfigs.extendedServiceSpecificInfo.data(), 1341 legacy_request->sdea_service_specific_info_len); 1342 legacy_request->rx_match_filter_len = 1343 hidl_request.baseConfigs.rxMatchFilter.size(); 1344 if (legacy_request->rx_match_filter_len > NAN_MAX_MATCH_FILTER_LEN) { 1345 LOG(ERROR) << "convertHidlNanPublishRequestToLegacy: " 1346 "rx_match_filter_len too large"; 1347 return false; 1348 } 1349 memcpy(legacy_request->rx_match_filter, 1350 hidl_request.baseConfigs.rxMatchFilter.data(), 1351 legacy_request->rx_match_filter_len); 1352 legacy_request->tx_match_filter_len = 1353 hidl_request.baseConfigs.txMatchFilter.size(); 1354 if (legacy_request->tx_match_filter_len > NAN_MAX_MATCH_FILTER_LEN) { 1355 LOG(ERROR) << "convertHidlNanPublishRequestToLegacy: " 1356 "tx_match_filter_len too large"; 1357 return false; 1358 } 1359 memcpy(legacy_request->tx_match_filter, 1360 hidl_request.baseConfigs.txMatchFilter.data(), 1361 legacy_request->tx_match_filter_len); 1362 legacy_request->rssi_threshold_flag = 1363 hidl_request.baseConfigs.useRssiThreshold; 1364 legacy_request->recv_indication_cfg = 0; 1365 legacy_request->recv_indication_cfg |= 1366 hidl_request.baseConfigs.disableDiscoveryTerminationIndication ? 0x1 1367 : 0x0; 1368 legacy_request->recv_indication_cfg |= 1369 hidl_request.baseConfigs.disableMatchExpirationIndication ? 0x2 : 0x0; 1370 legacy_request->recv_indication_cfg |= 1371 hidl_request.baseConfigs.disableFollowupReceivedIndication ? 0x4 : 0x0; 1372 legacy_request->recv_indication_cfg |= 0x8; 1373 legacy_request->cipher_type = 1374 (unsigned int)hidl_request.baseConfigs.securityConfig.cipherType; 1375 if (hidl_request.baseConfigs.securityConfig.securityType == 1376 NanDataPathSecurityType::PMK) { 1377 legacy_request->key_info.key_type = 1378 legacy_hal::NAN_SECURITY_KEY_INPUT_PMK; 1379 legacy_request->key_info.body.pmk_info.pmk_len = 1380 hidl_request.baseConfigs.securityConfig.pmk.size(); 1381 if (legacy_request->key_info.body.pmk_info.pmk_len != 1382 NAN_PMK_INFO_LEN) { 1383 LOG(ERROR) 1384 << "convertHidlNanPublishRequestToLegacy: invalid pmk_len"; 1385 return false; 1386 } 1387 memcpy(legacy_request->key_info.body.pmk_info.pmk, 1388 hidl_request.baseConfigs.securityConfig.pmk.data(), 1389 legacy_request->key_info.body.pmk_info.pmk_len); 1390 } 1391 if (hidl_request.baseConfigs.securityConfig.securityType == 1392 NanDataPathSecurityType::PASSPHRASE) { 1393 legacy_request->key_info.key_type = 1394 legacy_hal::NAN_SECURITY_KEY_INPUT_PASSPHRASE; 1395 legacy_request->key_info.body.passphrase_info.passphrase_len = 1396 hidl_request.baseConfigs.securityConfig.passphrase.size(); 1397 if (legacy_request->key_info.body.passphrase_info.passphrase_len < 1398 NAN_SECURITY_MIN_PASSPHRASE_LEN) { 1399 LOG(ERROR) << "convertHidlNanPublishRequestToLegacy: " 1400 "passphrase_len too small"; 1401 return false; 1402 } 1403 if (legacy_request->key_info.body.passphrase_info.passphrase_len > 1404 NAN_SECURITY_MAX_PASSPHRASE_LEN) { 1405 LOG(ERROR) << "convertHidlNanPublishRequestToLegacy: " 1406 "passphrase_len too large"; 1407 return false; 1408 } 1409 memcpy(legacy_request->key_info.body.passphrase_info.passphrase, 1410 hidl_request.baseConfigs.securityConfig.passphrase.data(), 1411 legacy_request->key_info.body.passphrase_info.passphrase_len); 1412 } 1413 legacy_request->sdea_params.security_cfg = 1414 (hidl_request.baseConfigs.securityConfig.securityType != 1415 NanDataPathSecurityType::OPEN) 1416 ? legacy_hal::NAN_DP_CONFIG_SECURITY 1417 : legacy_hal::NAN_DP_CONFIG_NO_SECURITY; 1418 legacy_request->sdea_params.ranging_state = 1419 hidl_request.baseConfigs.rangingRequired 1420 ? legacy_hal::NAN_RANGING_ENABLE 1421 : legacy_hal::NAN_RANGING_DISABLE; 1422 legacy_request->ranging_cfg.ranging_interval_msec = 1423 hidl_request.baseConfigs.rangingIntervalMsec; 1424 legacy_request->ranging_cfg.config_ranging_indications = 1425 hidl_request.baseConfigs.configRangingIndications; 1426 legacy_request->ranging_cfg.distance_ingress_mm = 1427 hidl_request.baseConfigs.distanceIngressCm * 10; 1428 legacy_request->ranging_cfg.distance_egress_mm = 1429 hidl_request.baseConfigs.distanceEgressCm * 10; 1430 legacy_request->ranging_auto_response = 1431 hidl_request.baseConfigs.rangingRequired 1432 ? legacy_hal::NAN_RANGING_AUTO_RESPONSE_ENABLE 1433 : legacy_hal::NAN_RANGING_AUTO_RESPONSE_DISABLE; 1434 legacy_request->sdea_params.range_report = 1435 legacy_hal::NAN_DISABLE_RANGE_REPORT; 1436 legacy_request->publish_type = 1437 convertHidlNanPublishTypeToLegacy(hidl_request.publishType); 1438 legacy_request->tx_type = convertHidlNanTxTypeToLegacy(hidl_request.txType); 1439 legacy_request->service_responder_policy = 1440 hidl_request.autoAcceptDataPathRequests 1441 ? legacy_hal::NAN_SERVICE_ACCEPT_POLICY_ALL 1442 : legacy_hal::NAN_SERVICE_ACCEPT_POLICY_NONE; 1443 1444 return true; 1445 } 1446 1447 bool convertHidlNanSubscribeRequestToLegacy( 1448 const NanSubscribeRequest& hidl_request, 1449 legacy_hal::NanSubscribeRequest* legacy_request) { 1450 if (!legacy_request) { 1451 LOG(ERROR) 1452 << "convertHidlNanSubscribeRequestToLegacy: legacy_request is null"; 1453 return false; 1454 } 1455 *legacy_request = {}; 1456 1457 legacy_request->subscribe_id = hidl_request.baseConfigs.sessionId; 1458 legacy_request->ttl = hidl_request.baseConfigs.ttlSec; 1459 legacy_request->period = hidl_request.baseConfigs.discoveryWindowPeriod; 1460 legacy_request->subscribe_count = hidl_request.baseConfigs.discoveryCount; 1461 legacy_request->service_name_len = 1462 hidl_request.baseConfigs.serviceName.size(); 1463 if (legacy_request->service_name_len > NAN_MAX_SERVICE_NAME_LEN) { 1464 LOG(ERROR) << "convertHidlNanSubscribeRequestToLegacy: " 1465 "service_name_len too large"; 1466 return false; 1467 } 1468 memcpy(legacy_request->service_name, 1469 hidl_request.baseConfigs.serviceName.data(), 1470 legacy_request->service_name_len); 1471 legacy_request->subscribe_match_indicator = convertHidlNanMatchAlgToLegacy( 1472 hidl_request.baseConfigs.discoveryMatchIndicator); 1473 legacy_request->service_specific_info_len = 1474 hidl_request.baseConfigs.serviceSpecificInfo.size(); 1475 if (legacy_request->service_specific_info_len > 1476 NAN_MAX_SERVICE_SPECIFIC_INFO_LEN) { 1477 LOG(ERROR) << "convertHidlNanSubscribeRequestToLegacy: " 1478 "service_specific_info_len too large"; 1479 return false; 1480 } 1481 memcpy(legacy_request->service_specific_info, 1482 hidl_request.baseConfigs.serviceSpecificInfo.data(), 1483 legacy_request->service_specific_info_len); 1484 legacy_request->sdea_service_specific_info_len = 1485 hidl_request.baseConfigs.extendedServiceSpecificInfo.size(); 1486 if (legacy_request->sdea_service_specific_info_len > 1487 NAN_MAX_SDEA_SERVICE_SPECIFIC_INFO_LEN) { 1488 LOG(ERROR) << "convertHidlNanSubscribeRequestToLegacy: " 1489 "sdea_service_specific_info_len too large"; 1490 return false; 1491 } 1492 memcpy(legacy_request->sdea_service_specific_info, 1493 hidl_request.baseConfigs.extendedServiceSpecificInfo.data(), 1494 legacy_request->sdea_service_specific_info_len); 1495 legacy_request->rx_match_filter_len = 1496 hidl_request.baseConfigs.rxMatchFilter.size(); 1497 if (legacy_request->rx_match_filter_len > NAN_MAX_MATCH_FILTER_LEN) { 1498 LOG(ERROR) << "convertHidlNanSubscribeRequestToLegacy: " 1499 "rx_match_filter_len too large"; 1500 return false; 1501 } 1502 memcpy(legacy_request->rx_match_filter, 1503 hidl_request.baseConfigs.rxMatchFilter.data(), 1504 legacy_request->rx_match_filter_len); 1505 legacy_request->tx_match_filter_len = 1506 hidl_request.baseConfigs.txMatchFilter.size(); 1507 if (legacy_request->tx_match_filter_len > NAN_MAX_MATCH_FILTER_LEN) { 1508 LOG(ERROR) << "convertHidlNanSubscribeRequestToLegacy: " 1509 "tx_match_filter_len too large"; 1510 return false; 1511 } 1512 memcpy(legacy_request->tx_match_filter, 1513 hidl_request.baseConfigs.txMatchFilter.data(), 1514 legacy_request->tx_match_filter_len); 1515 legacy_request->rssi_threshold_flag = 1516 hidl_request.baseConfigs.useRssiThreshold; 1517 legacy_request->recv_indication_cfg = 0; 1518 legacy_request->recv_indication_cfg |= 1519 hidl_request.baseConfigs.disableDiscoveryTerminationIndication ? 0x1 1520 : 0x0; 1521 legacy_request->recv_indication_cfg |= 1522 hidl_request.baseConfigs.disableMatchExpirationIndication ? 0x2 : 0x0; 1523 legacy_request->recv_indication_cfg |= 1524 hidl_request.baseConfigs.disableFollowupReceivedIndication ? 0x4 : 0x0; 1525 legacy_request->cipher_type = 1526 (unsigned int)hidl_request.baseConfigs.securityConfig.cipherType; 1527 if (hidl_request.baseConfigs.securityConfig.securityType == 1528 NanDataPathSecurityType::PMK) { 1529 legacy_request->key_info.key_type = 1530 legacy_hal::NAN_SECURITY_KEY_INPUT_PMK; 1531 legacy_request->key_info.body.pmk_info.pmk_len = 1532 hidl_request.baseConfigs.securityConfig.pmk.size(); 1533 if (legacy_request->key_info.body.pmk_info.pmk_len != 1534 NAN_PMK_INFO_LEN) { 1535 LOG(ERROR) 1536 << "convertHidlNanSubscribeRequestToLegacy: invalid pmk_len"; 1537 return false; 1538 } 1539 memcpy(legacy_request->key_info.body.pmk_info.pmk, 1540 hidl_request.baseConfigs.securityConfig.pmk.data(), 1541 legacy_request->key_info.body.pmk_info.pmk_len); 1542 } 1543 if (hidl_request.baseConfigs.securityConfig.securityType == 1544 NanDataPathSecurityType::PASSPHRASE) { 1545 legacy_request->key_info.key_type = 1546 legacy_hal::NAN_SECURITY_KEY_INPUT_PASSPHRASE; 1547 legacy_request->key_info.body.passphrase_info.passphrase_len = 1548 hidl_request.baseConfigs.securityConfig.passphrase.size(); 1549 if (legacy_request->key_info.body.passphrase_info.passphrase_len < 1550 NAN_SECURITY_MIN_PASSPHRASE_LEN) { 1551 LOG(ERROR) << "convertHidlNanSubscribeRequestToLegacy: " 1552 "passphrase_len too small"; 1553 return false; 1554 } 1555 if (legacy_request->key_info.body.passphrase_info.passphrase_len > 1556 NAN_SECURITY_MAX_PASSPHRASE_LEN) { 1557 LOG(ERROR) << "convertHidlNanSubscribeRequestToLegacy: " 1558 "passphrase_len too large"; 1559 return false; 1560 } 1561 memcpy(legacy_request->key_info.body.passphrase_info.passphrase, 1562 hidl_request.baseConfigs.securityConfig.passphrase.data(), 1563 legacy_request->key_info.body.passphrase_info.passphrase_len); 1564 } 1565 legacy_request->sdea_params.security_cfg = 1566 (hidl_request.baseConfigs.securityConfig.securityType != 1567 NanDataPathSecurityType::OPEN) 1568 ? legacy_hal::NAN_DP_CONFIG_SECURITY 1569 : legacy_hal::NAN_DP_CONFIG_NO_SECURITY; 1570 legacy_request->sdea_params.ranging_state = 1571 hidl_request.baseConfigs.rangingRequired 1572 ? legacy_hal::NAN_RANGING_ENABLE 1573 : legacy_hal::NAN_RANGING_DISABLE; 1574 legacy_request->ranging_cfg.ranging_interval_msec = 1575 hidl_request.baseConfigs.rangingIntervalMsec; 1576 legacy_request->ranging_cfg.config_ranging_indications = 1577 hidl_request.baseConfigs.configRangingIndications; 1578 legacy_request->ranging_cfg.distance_ingress_mm = 1579 hidl_request.baseConfigs.distanceIngressCm * 10; 1580 legacy_request->ranging_cfg.distance_egress_mm = 1581 hidl_request.baseConfigs.distanceEgressCm * 10; 1582 legacy_request->ranging_auto_response = 1583 hidl_request.baseConfigs.rangingRequired 1584 ? legacy_hal::NAN_RANGING_AUTO_RESPONSE_ENABLE 1585 : legacy_hal::NAN_RANGING_AUTO_RESPONSE_DISABLE; 1586 legacy_request->sdea_params.range_report = 1587 legacy_hal::NAN_DISABLE_RANGE_REPORT; 1588 legacy_request->subscribe_type = 1589 convertHidlNanSubscribeTypeToLegacy(hidl_request.subscribeType); 1590 legacy_request->serviceResponseFilter = 1591 convertHidlNanSrfTypeToLegacy(hidl_request.srfType); 1592 legacy_request->serviceResponseInclude = 1593 hidl_request.srfRespondIfInAddressSet 1594 ? legacy_hal::NAN_SRF_INCLUDE_RESPOND 1595 : legacy_hal::NAN_SRF_INCLUDE_DO_NOT_RESPOND; 1596 legacy_request->useServiceResponseFilter = 1597 hidl_request.shouldUseSrf ? legacy_hal::NAN_USE_SRF 1598 : legacy_hal::NAN_DO_NOT_USE_SRF; 1599 legacy_request->ssiRequiredForMatchIndication = 1600 hidl_request.isSsiRequiredForMatch 1601 ? legacy_hal::NAN_SSI_REQUIRED_IN_MATCH_IND 1602 : legacy_hal::NAN_SSI_NOT_REQUIRED_IN_MATCH_IND; 1603 legacy_request->num_intf_addr_present = hidl_request.intfAddr.size(); 1604 if (legacy_request->num_intf_addr_present > NAN_MAX_SUBSCRIBE_MAX_ADDRESS) { 1605 LOG(ERROR) << "convertHidlNanSubscribeRequestToLegacy: " 1606 "num_intf_addr_present - too many"; 1607 return false; 1608 } 1609 for (int i = 0; i < legacy_request->num_intf_addr_present; i++) { 1610 memcpy(legacy_request->intf_addr[i], hidl_request.intfAddr[i].data(), 1611 6); 1612 } 1613 1614 return true; 1615 } 1616 1617 bool convertHidlNanTransmitFollowupRequestToLegacy( 1618 const NanTransmitFollowupRequest& hidl_request, 1619 legacy_hal::NanTransmitFollowupRequest* legacy_request) { 1620 if (!legacy_request) { 1621 LOG(ERROR) << "convertHidlNanTransmitFollowupRequestToLegacy: " 1622 "legacy_request is null"; 1623 return false; 1624 } 1625 *legacy_request = {}; 1626 1627 legacy_request->publish_subscribe_id = hidl_request.discoverySessionId; 1628 legacy_request->requestor_instance_id = hidl_request.peerId; 1629 memcpy(legacy_request->addr, hidl_request.addr.data(), 6); 1630 legacy_request->priority = hidl_request.isHighPriority 1631 ? legacy_hal::NAN_TX_PRIORITY_HIGH 1632 : legacy_hal::NAN_TX_PRIORITY_NORMAL; 1633 legacy_request->dw_or_faw = hidl_request.shouldUseDiscoveryWindow 1634 ? legacy_hal::NAN_TRANSMIT_IN_DW 1635 : legacy_hal::NAN_TRANSMIT_IN_FAW; 1636 legacy_request->service_specific_info_len = 1637 hidl_request.serviceSpecificInfo.size(); 1638 if (legacy_request->service_specific_info_len > 1639 NAN_MAX_SERVICE_SPECIFIC_INFO_LEN) { 1640 LOG(ERROR) << "convertHidlNanTransmitFollowupRequestToLegacy: " 1641 "service_specific_info_len too large"; 1642 return false; 1643 } 1644 memcpy(legacy_request->service_specific_info, 1645 hidl_request.serviceSpecificInfo.data(), 1646 legacy_request->service_specific_info_len); 1647 legacy_request->sdea_service_specific_info_len = 1648 hidl_request.extendedServiceSpecificInfo.size(); 1649 if (legacy_request->sdea_service_specific_info_len > 1650 NAN_MAX_SDEA_SERVICE_SPECIFIC_INFO_LEN) { 1651 LOG(ERROR) << "convertHidlNanTransmitFollowupRequestToLegacy: " 1652 "sdea_service_specific_info_len too large"; 1653 return false; 1654 } 1655 memcpy(legacy_request->sdea_service_specific_info, 1656 hidl_request.extendedServiceSpecificInfo.data(), 1657 legacy_request->sdea_service_specific_info_len); 1658 legacy_request->recv_indication_cfg = 1659 hidl_request.disableFollowupResultIndication ? 0x1 : 0x0; 1660 1661 return true; 1662 } 1663 1664 bool convertHidlNanConfigRequestToLegacy( 1665 const NanConfigRequest& hidl_request, 1666 legacy_hal::NanConfigRequest* legacy_request) { 1667 if (!legacy_request) { 1668 LOG(ERROR) 1669 << "convertHidlNanConfigRequestToLegacy: legacy_request is null"; 1670 return false; 1671 } 1672 *legacy_request = {}; 1673 1674 // TODO: b/34059183 tracks missing configurations in legacy HAL or uknown 1675 // defaults 1676 legacy_request->master_pref = hidl_request.masterPref; 1677 legacy_request->discovery_indication_cfg = 0; 1678 legacy_request->discovery_indication_cfg |= 1679 hidl_request.disableDiscoveryAddressChangeIndication ? 0x1 : 0x0; 1680 legacy_request->discovery_indication_cfg |= 1681 hidl_request.disableStartedClusterIndication ? 0x2 : 0x0; 1682 legacy_request->discovery_indication_cfg |= 1683 hidl_request.disableJoinedClusterIndication ? 0x4 : 0x0; 1684 legacy_request->config_sid_beacon = 1; 1685 if (hidl_request.numberOfPublishServiceIdsInBeacon > 127) { 1686 LOG(ERROR) << "convertHidlNanConfigRequestToLegacy: " 1687 "numberOfPublishServiceIdsInBeacon > 127"; 1688 return false; 1689 } 1690 legacy_request->sid_beacon = 1691 (hidl_request.includePublishServiceIdsInBeacon ? 0x1 : 0x0) | 1692 (hidl_request.numberOfPublishServiceIdsInBeacon << 1); 1693 legacy_request->config_subscribe_sid_beacon = 1; 1694 if (hidl_request.numberOfSubscribeServiceIdsInBeacon > 127) { 1695 LOG(ERROR) << "convertHidlNanConfigRequestToLegacy: " 1696 "numberOfSubscribeServiceIdsInBeacon > 127"; 1697 return false; 1698 } 1699 legacy_request->subscribe_sid_beacon_val = 1700 (hidl_request.includeSubscribeServiceIdsInBeacon ? 0x1 : 0x0) | 1701 (hidl_request.numberOfSubscribeServiceIdsInBeacon << 1); 1702 legacy_request->config_rssi_window_size = 1; 1703 legacy_request->rssi_window_size_val = hidl_request.rssiWindowSize; 1704 legacy_request->config_disc_mac_addr_randomization = 1; 1705 legacy_request->disc_mac_addr_rand_interval_sec = 1706 hidl_request.macAddressRandomizationIntervalSec; 1707 /* TODO : missing 1708 legacy_request->config_2dot4g_rssi_close = 1; 1709 legacy_request->rssi_close_2dot4g_val = 1710 hidl_request.bandSpecificConfig[ 1711 (size_t) NanBandIndex::NAN_BAND_24GHZ].rssiClose; 1712 legacy_request->config_2dot4g_rssi_middle = 1; 1713 legacy_request->rssi_middle_2dot4g_val = 1714 hidl_request.bandSpecificConfig[ 1715 (size_t) NanBandIndex::NAN_BAND_24GHZ].rssiMiddle; 1716 legacy_request->config_2dot4g_rssi_proximity = 1; 1717 legacy_request->rssi_proximity_2dot4g_val = 1718 hidl_request.bandSpecificConfig[ 1719 (size_t) NanBandIndex::NAN_BAND_24GHZ].rssiCloseProximity; 1720 */ 1721 legacy_request->config_scan_params = 1; 1722 legacy_request->scan_params_val 1723 .dwell_time[legacy_hal::NAN_CHANNEL_24G_BAND] = 1724 hidl_request.bandSpecificConfig[(size_t)NanBandIndex::NAN_BAND_24GHZ] 1725 .dwellTimeMs; 1726 legacy_request->scan_params_val 1727 .scan_period[legacy_hal::NAN_CHANNEL_24G_BAND] = 1728 hidl_request.bandSpecificConfig[(size_t)NanBandIndex::NAN_BAND_24GHZ] 1729 .scanPeriodSec; 1730 legacy_request->config_dw.config_2dot4g_dw_band = 1731 hidl_request.bandSpecificConfig[(size_t)NanBandIndex::NAN_BAND_24GHZ] 1732 .validDiscoveryWindowIntervalVal; 1733 legacy_request->config_dw.dw_2dot4g_interval_val = 1734 hidl_request.bandSpecificConfig[(size_t)NanBandIndex::NAN_BAND_24GHZ] 1735 .discoveryWindowIntervalVal; 1736 /* TODO: missing 1737 legacy_request->config_5g_rssi_close = 1; 1738 legacy_request->rssi_close_5g_val = 1739 hidl_request.bandSpecificConfig[ 1740 (size_t) NanBandIndex::NAN_BAND_5GHZ].rssiClose; 1741 legacy_request->config_5g_rssi_middle = 1; 1742 legacy_request->rssi_middle_5g_val = 1743 hidl_request.bandSpecificConfig[ 1744 (size_t) NanBandIndex::NAN_BAND_5GHZ].rssiMiddle; 1745 */ 1746 legacy_request->config_5g_rssi_close_proximity = 1; 1747 legacy_request->rssi_close_proximity_5g_val = 1748 hidl_request.bandSpecificConfig[(size_t)NanBandIndex::NAN_BAND_5GHZ] 1749 .rssiCloseProximity; 1750 legacy_request->scan_params_val 1751 .dwell_time[legacy_hal::NAN_CHANNEL_5G_BAND_LOW] = 1752 hidl_request.bandSpecificConfig[(size_t)NanBandIndex::NAN_BAND_5GHZ] 1753 .dwellTimeMs; 1754 legacy_request->scan_params_val 1755 .scan_period[legacy_hal::NAN_CHANNEL_5G_BAND_LOW] = 1756 hidl_request.bandSpecificConfig[(size_t)NanBandIndex::NAN_BAND_5GHZ] 1757 .scanPeriodSec; 1758 legacy_request->scan_params_val 1759 .dwell_time[legacy_hal::NAN_CHANNEL_5G_BAND_HIGH] = 1760 hidl_request.bandSpecificConfig[(size_t)NanBandIndex::NAN_BAND_5GHZ] 1761 .dwellTimeMs; 1762 legacy_request->scan_params_val 1763 .scan_period[legacy_hal::NAN_CHANNEL_5G_BAND_HIGH] = 1764 hidl_request.bandSpecificConfig[(size_t)NanBandIndex::NAN_BAND_5GHZ] 1765 .scanPeriodSec; 1766 legacy_request->config_dw.config_5g_dw_band = 1767 hidl_request.bandSpecificConfig[(size_t)NanBandIndex::NAN_BAND_5GHZ] 1768 .validDiscoveryWindowIntervalVal; 1769 legacy_request->config_dw.dw_5g_interval_val = 1770 hidl_request.bandSpecificConfig[(size_t)NanBandIndex::NAN_BAND_5GHZ] 1771 .discoveryWindowIntervalVal; 1772 1773 return true; 1774 } 1775 1776 bool convertHidlNanConfigRequest_1_2ToLegacy( 1777 const NanConfigRequest& hidl_request1, 1778 const V1_2::NanConfigRequestSupplemental& hidl_request2, 1779 legacy_hal::NanConfigRequest* legacy_request) { 1780 if (!legacy_request) { 1781 LOG(ERROR) << "convertHidlNanConfigRequest_1_2ToLegacy: legacy_request " 1782 "is null"; 1783 return false; 1784 } 1785 1786 *legacy_request = {}; 1787 if (!convertHidlNanConfigRequestToLegacy(hidl_request1, legacy_request)) { 1788 return false; 1789 } 1790 1791 legacy_request->config_discovery_beacon_int = 1; 1792 legacy_request->discovery_beacon_interval = 1793 hidl_request2.discoveryBeaconIntervalMs; 1794 legacy_request->config_nss = 1; 1795 legacy_request->nss = hidl_request2.numberOfSpatialStreamsInDiscovery; 1796 legacy_request->config_dw_early_termination = 1; 1797 legacy_request->enable_dw_termination = 1798 hidl_request2.enableDiscoveryWindowEarlyTermination; 1799 legacy_request->config_enable_ranging = 1; 1800 legacy_request->enable_ranging = hidl_request2.enableRanging; 1801 1802 return true; 1803 } 1804 1805 bool convertHidlNanDataPathInitiatorRequestToLegacy( 1806 const NanInitiateDataPathRequest& hidl_request, 1807 legacy_hal::NanDataPathInitiatorRequest* legacy_request) { 1808 if (!legacy_request) { 1809 LOG(ERROR) << "convertHidlNanDataPathInitiatorRequestToLegacy: " 1810 "legacy_request is null"; 1811 return false; 1812 } 1813 *legacy_request = {}; 1814 1815 legacy_request->requestor_instance_id = hidl_request.peerId; 1816 memcpy(legacy_request->peer_disc_mac_addr, 1817 hidl_request.peerDiscMacAddr.data(), 6); 1818 legacy_request->channel_request_type = 1819 convertHidlNanDataPathChannelCfgToLegacy( 1820 hidl_request.channelRequestType); 1821 legacy_request->channel = hidl_request.channel; 1822 strcpy(legacy_request->ndp_iface, hidl_request.ifaceName.c_str()); 1823 legacy_request->ndp_cfg.security_cfg = 1824 (hidl_request.securityConfig.securityType != 1825 NanDataPathSecurityType::OPEN) 1826 ? legacy_hal::NAN_DP_CONFIG_SECURITY 1827 : legacy_hal::NAN_DP_CONFIG_NO_SECURITY; 1828 legacy_request->app_info.ndp_app_info_len = hidl_request.appInfo.size(); 1829 if (legacy_request->app_info.ndp_app_info_len > NAN_DP_MAX_APP_INFO_LEN) { 1830 LOG(ERROR) << "convertHidlNanDataPathInitiatorRequestToLegacy: " 1831 "ndp_app_info_len too large"; 1832 return false; 1833 } 1834 memcpy(legacy_request->app_info.ndp_app_info, hidl_request.appInfo.data(), 1835 legacy_request->app_info.ndp_app_info_len); 1836 legacy_request->cipher_type = 1837 (unsigned int)hidl_request.securityConfig.cipherType; 1838 if (hidl_request.securityConfig.securityType == 1839 NanDataPathSecurityType::PMK) { 1840 legacy_request->key_info.key_type = 1841 legacy_hal::NAN_SECURITY_KEY_INPUT_PMK; 1842 legacy_request->key_info.body.pmk_info.pmk_len = 1843 hidl_request.securityConfig.pmk.size(); 1844 if (legacy_request->key_info.body.pmk_info.pmk_len != 1845 NAN_PMK_INFO_LEN) { 1846 LOG(ERROR) << "convertHidlNanDataPathInitiatorRequestToLegacy: " 1847 "invalid pmk_len"; 1848 return false; 1849 } 1850 memcpy(legacy_request->key_info.body.pmk_info.pmk, 1851 hidl_request.securityConfig.pmk.data(), 1852 legacy_request->key_info.body.pmk_info.pmk_len); 1853 } 1854 if (hidl_request.securityConfig.securityType == 1855 NanDataPathSecurityType::PASSPHRASE) { 1856 legacy_request->key_info.key_type = 1857 legacy_hal::NAN_SECURITY_KEY_INPUT_PASSPHRASE; 1858 legacy_request->key_info.body.passphrase_info.passphrase_len = 1859 hidl_request.securityConfig.passphrase.size(); 1860 if (legacy_request->key_info.body.passphrase_info.passphrase_len < 1861 NAN_SECURITY_MIN_PASSPHRASE_LEN) { 1862 LOG(ERROR) << "convertHidlNanDataPathInitiatorRequestToLegacy: " 1863 "passphrase_len too small"; 1864 return false; 1865 } 1866 if (legacy_request->key_info.body.passphrase_info.passphrase_len > 1867 NAN_SECURITY_MAX_PASSPHRASE_LEN) { 1868 LOG(ERROR) << "convertHidlNanDataPathInitiatorRequestToLegacy: " 1869 "passphrase_len too large"; 1870 return false; 1871 } 1872 memcpy(legacy_request->key_info.body.passphrase_info.passphrase, 1873 hidl_request.securityConfig.passphrase.data(), 1874 legacy_request->key_info.body.passphrase_info.passphrase_len); 1875 } 1876 legacy_request->service_name_len = hidl_request.serviceNameOutOfBand.size(); 1877 if (legacy_request->service_name_len > NAN_MAX_SERVICE_NAME_LEN) { 1878 LOG(ERROR) << "convertHidlNanDataPathInitiatorRequestToLegacy: " 1879 "service_name_len too large"; 1880 return false; 1881 } 1882 memcpy(legacy_request->service_name, 1883 hidl_request.serviceNameOutOfBand.data(), 1884 legacy_request->service_name_len); 1885 1886 return true; 1887 } 1888 1889 bool convertHidlNanDataPathIndicationResponseToLegacy( 1890 const NanRespondToDataPathIndicationRequest& hidl_request, 1891 legacy_hal::NanDataPathIndicationResponse* legacy_request) { 1892 if (!legacy_request) { 1893 LOG(ERROR) << "convertHidlNanDataPathIndicationResponseToLegacy: " 1894 "legacy_request is null"; 1895 return false; 1896 } 1897 *legacy_request = {}; 1898 1899 legacy_request->rsp_code = hidl_request.acceptRequest 1900 ? legacy_hal::NAN_DP_REQUEST_ACCEPT 1901 : legacy_hal::NAN_DP_REQUEST_REJECT; 1902 legacy_request->ndp_instance_id = hidl_request.ndpInstanceId; 1903 strcpy(legacy_request->ndp_iface, hidl_request.ifaceName.c_str()); 1904 legacy_request->ndp_cfg.security_cfg = 1905 (hidl_request.securityConfig.securityType != 1906 NanDataPathSecurityType::OPEN) 1907 ? legacy_hal::NAN_DP_CONFIG_SECURITY 1908 : legacy_hal::NAN_DP_CONFIG_NO_SECURITY; 1909 legacy_request->app_info.ndp_app_info_len = hidl_request.appInfo.size(); 1910 if (legacy_request->app_info.ndp_app_info_len > NAN_DP_MAX_APP_INFO_LEN) { 1911 LOG(ERROR) << "convertHidlNanDataPathIndicationResponseToLegacy: " 1912 "ndp_app_info_len too large"; 1913 return false; 1914 } 1915 memcpy(legacy_request->app_info.ndp_app_info, hidl_request.appInfo.data(), 1916 legacy_request->app_info.ndp_app_info_len); 1917 legacy_request->cipher_type = 1918 (unsigned int)hidl_request.securityConfig.cipherType; 1919 if (hidl_request.securityConfig.securityType == 1920 NanDataPathSecurityType::PMK) { 1921 legacy_request->key_info.key_type = 1922 legacy_hal::NAN_SECURITY_KEY_INPUT_PMK; 1923 legacy_request->key_info.body.pmk_info.pmk_len = 1924 hidl_request.securityConfig.pmk.size(); 1925 if (legacy_request->key_info.body.pmk_info.pmk_len != 1926 NAN_PMK_INFO_LEN) { 1927 LOG(ERROR) << "convertHidlNanDataPathIndicationResponseToLegacy: " 1928 "invalid pmk_len"; 1929 return false; 1930 } 1931 memcpy(legacy_request->key_info.body.pmk_info.pmk, 1932 hidl_request.securityConfig.pmk.data(), 1933 legacy_request->key_info.body.pmk_info.pmk_len); 1934 } 1935 if (hidl_request.securityConfig.securityType == 1936 NanDataPathSecurityType::PASSPHRASE) { 1937 legacy_request->key_info.key_type = 1938 legacy_hal::NAN_SECURITY_KEY_INPUT_PASSPHRASE; 1939 legacy_request->key_info.body.passphrase_info.passphrase_len = 1940 hidl_request.securityConfig.passphrase.size(); 1941 if (legacy_request->key_info.body.passphrase_info.passphrase_len < 1942 NAN_SECURITY_MIN_PASSPHRASE_LEN) { 1943 LOG(ERROR) << "convertHidlNanDataPathIndicationResponseToLegacy: " 1944 "passphrase_len too small"; 1945 return false; 1946 } 1947 if (legacy_request->key_info.body.passphrase_info.passphrase_len > 1948 NAN_SECURITY_MAX_PASSPHRASE_LEN) { 1949 LOG(ERROR) << "convertHidlNanDataPathIndicationResponseToLegacy: " 1950 "passphrase_len too large"; 1951 return false; 1952 } 1953 memcpy(legacy_request->key_info.body.passphrase_info.passphrase, 1954 hidl_request.securityConfig.passphrase.data(), 1955 legacy_request->key_info.body.passphrase_info.passphrase_len); 1956 } 1957 legacy_request->service_name_len = hidl_request.serviceNameOutOfBand.size(); 1958 if (legacy_request->service_name_len > NAN_MAX_SERVICE_NAME_LEN) { 1959 LOG(ERROR) << "convertHidlNanDataPathIndicationResponseToLegacy: " 1960 "service_name_len too large"; 1961 return false; 1962 } 1963 memcpy(legacy_request->service_name, 1964 hidl_request.serviceNameOutOfBand.data(), 1965 legacy_request->service_name_len); 1966 1967 return true; 1968 } 1969 1970 bool convertLegacyNanResponseHeaderToHidl( 1971 const legacy_hal::NanResponseMsg& legacy_response, 1972 WifiNanStatus* wifiNanStatus) { 1973 if (!wifiNanStatus) { 1974 LOG(ERROR) 1975 << "convertLegacyNanResponseHeaderToHidl: wifiNanStatus is null"; 1976 return false; 1977 } 1978 *wifiNanStatus = {}; 1979 1980 convertToWifiNanStatus(legacy_response.status, legacy_response.nan_error, 1981 sizeof(legacy_response.nan_error), wifiNanStatus); 1982 return true; 1983 } 1984 1985 bool convertLegacyNanCapabilitiesResponseToHidl( 1986 const legacy_hal::NanCapabilities& legacy_response, 1987 NanCapabilities* hidl_response) { 1988 if (!hidl_response) { 1989 LOG(ERROR) << "convertLegacyNanCapabilitiesResponseToHidl: " 1990 "hidl_response is null"; 1991 return false; 1992 } 1993 *hidl_response = {}; 1994 1995 hidl_response->maxConcurrentClusters = 1996 legacy_response.max_concurrent_nan_clusters; 1997 hidl_response->maxPublishes = legacy_response.max_publishes; 1998 hidl_response->maxSubscribes = legacy_response.max_subscribes; 1999 hidl_response->maxServiceNameLen = legacy_response.max_service_name_len; 2000 hidl_response->maxMatchFilterLen = legacy_response.max_match_filter_len; 2001 hidl_response->maxTotalMatchFilterLen = 2002 legacy_response.max_total_match_filter_len; 2003 hidl_response->maxServiceSpecificInfoLen = 2004 legacy_response.max_service_specific_info_len; 2005 hidl_response->maxExtendedServiceSpecificInfoLen = 2006 legacy_response.max_sdea_service_specific_info_len; 2007 hidl_response->maxNdiInterfaces = legacy_response.max_ndi_interfaces; 2008 hidl_response->maxNdpSessions = legacy_response.max_ndp_sessions; 2009 hidl_response->maxAppInfoLen = legacy_response.max_app_info_len; 2010 hidl_response->maxQueuedTransmitFollowupMsgs = 2011 legacy_response.max_queued_transmit_followup_msgs; 2012 hidl_response->maxSubscribeInterfaceAddresses = 2013 legacy_response.max_subscribe_address; 2014 hidl_response->supportedCipherSuites = 2015 legacy_response.cipher_suites_supported; 2016 2017 return true; 2018 } 2019 2020 bool convertLegacyNanMatchIndToHidl(const legacy_hal::NanMatchInd& legacy_ind, 2021 NanMatchInd* hidl_ind) { 2022 if (!hidl_ind) { 2023 LOG(ERROR) << "convertLegacyNanMatchIndToHidl: hidl_ind is null"; 2024 return false; 2025 } 2026 *hidl_ind = {}; 2027 2028 hidl_ind->discoverySessionId = legacy_ind.publish_subscribe_id; 2029 hidl_ind->peerId = legacy_ind.requestor_instance_id; 2030 hidl_ind->addr = hidl_array<uint8_t, 6>(legacy_ind.addr); 2031 hidl_ind->serviceSpecificInfo = 2032 std::vector<uint8_t>(legacy_ind.service_specific_info, 2033 legacy_ind.service_specific_info + 2034 legacy_ind.service_specific_info_len); 2035 hidl_ind->extendedServiceSpecificInfo = 2036 std::vector<uint8_t>(legacy_ind.sdea_service_specific_info, 2037 legacy_ind.sdea_service_specific_info + 2038 legacy_ind.sdea_service_specific_info_len); 2039 hidl_ind->matchFilter = std::vector<uint8_t>( 2040 legacy_ind.sdf_match_filter, 2041 legacy_ind.sdf_match_filter + legacy_ind.sdf_match_filter_len); 2042 hidl_ind->matchOccuredInBeaconFlag = legacy_ind.match_occured_flag == 1; 2043 hidl_ind->outOfResourceFlag = legacy_ind.out_of_resource_flag == 1; 2044 hidl_ind->rssiValue = legacy_ind.rssi_value; 2045 hidl_ind->peerCipherType = (NanCipherSuiteType)legacy_ind.peer_cipher_type; 2046 hidl_ind->peerRequiresSecurityEnabledInNdp = 2047 legacy_ind.peer_sdea_params.security_cfg == 2048 legacy_hal::NAN_DP_CONFIG_SECURITY; 2049 hidl_ind->peerRequiresRanging = legacy_ind.peer_sdea_params.ranging_state == 2050 legacy_hal::NAN_RANGING_ENABLE; 2051 hidl_ind->rangingMeasurementInCm = 2052 legacy_ind.range_info.range_measurement_mm / 10; 2053 hidl_ind->rangingIndicationType = legacy_ind.range_info.ranging_event_type; 2054 2055 return true; 2056 } 2057 2058 bool convertLegacyNanFollowupIndToHidl( 2059 const legacy_hal::NanFollowupInd& legacy_ind, 2060 NanFollowupReceivedInd* hidl_ind) { 2061 if (!hidl_ind) { 2062 LOG(ERROR) << "convertLegacyNanFollowupIndToHidl: hidl_ind is null"; 2063 return false; 2064 } 2065 *hidl_ind = {}; 2066 2067 hidl_ind->discoverySessionId = legacy_ind.publish_subscribe_id; 2068 hidl_ind->peerId = legacy_ind.requestor_instance_id; 2069 hidl_ind->addr = hidl_array<uint8_t, 6>(legacy_ind.addr); 2070 hidl_ind->receivedInFaw = legacy_ind.dw_or_faw == 1; 2071 hidl_ind->serviceSpecificInfo = 2072 std::vector<uint8_t>(legacy_ind.service_specific_info, 2073 legacy_ind.service_specific_info + 2074 legacy_ind.service_specific_info_len); 2075 hidl_ind->extendedServiceSpecificInfo = 2076 std::vector<uint8_t>(legacy_ind.sdea_service_specific_info, 2077 legacy_ind.sdea_service_specific_info + 2078 legacy_ind.sdea_service_specific_info_len); 2079 2080 return true; 2081 } 2082 2083 bool convertLegacyNanDataPathRequestIndToHidl( 2084 const legacy_hal::NanDataPathRequestInd& legacy_ind, 2085 NanDataPathRequestInd* hidl_ind) { 2086 if (!hidl_ind) { 2087 LOG(ERROR) 2088 << "convertLegacyNanDataPathRequestIndToHidl: hidl_ind is null"; 2089 return false; 2090 } 2091 *hidl_ind = {}; 2092 2093 hidl_ind->discoverySessionId = legacy_ind.service_instance_id; 2094 hidl_ind->peerDiscMacAddr = 2095 hidl_array<uint8_t, 6>(legacy_ind.peer_disc_mac_addr); 2096 hidl_ind->ndpInstanceId = legacy_ind.ndp_instance_id; 2097 hidl_ind->securityRequired = 2098 legacy_ind.ndp_cfg.security_cfg == legacy_hal::NAN_DP_CONFIG_SECURITY; 2099 hidl_ind->appInfo = 2100 std::vector<uint8_t>(legacy_ind.app_info.ndp_app_info, 2101 legacy_ind.app_info.ndp_app_info + 2102 legacy_ind.app_info.ndp_app_info_len); 2103 2104 return true; 2105 } 2106 2107 bool convertLegacyNdpChannelInfoToHidl( 2108 const legacy_hal::NanChannelInfo& legacy_struct, 2109 V1_2::NanDataPathChannelInfo* hidl_struct) { 2110 if (!hidl_struct) { 2111 LOG(ERROR) << "convertLegacyNdpChannelInfoToHidl: hidl_struct is null"; 2112 return false; 2113 } 2114 *hidl_struct = {}; 2115 2116 hidl_struct->channelFreq = legacy_struct.channel; 2117 hidl_struct->channelBandwidth = convertLegacyWifiChannelWidthToHidl( 2118 (legacy_hal::wifi_channel_width)legacy_struct.bandwidth); 2119 hidl_struct->numSpatialStreams = legacy_struct.nss; 2120 2121 return true; 2122 } 2123 2124 bool convertLegacyNanDataPathConfirmIndToHidl( 2125 const legacy_hal::NanDataPathConfirmInd& legacy_ind, 2126 V1_2::NanDataPathConfirmInd* hidl_ind) { 2127 if (!hidl_ind) { 2128 LOG(ERROR) 2129 << "convertLegacyNanDataPathConfirmIndToHidl: hidl_ind is null"; 2130 return false; 2131 } 2132 *hidl_ind = {}; 2133 2134 hidl_ind->V1_0.ndpInstanceId = legacy_ind.ndp_instance_id; 2135 hidl_ind->V1_0.dataPathSetupSuccess = 2136 legacy_ind.rsp_code == legacy_hal::NAN_DP_REQUEST_ACCEPT; 2137 hidl_ind->V1_0.peerNdiMacAddr = 2138 hidl_array<uint8_t, 6>(legacy_ind.peer_ndi_mac_addr); 2139 hidl_ind->V1_0.appInfo = 2140 std::vector<uint8_t>(legacy_ind.app_info.ndp_app_info, 2141 legacy_ind.app_info.ndp_app_info + 2142 legacy_ind.app_info.ndp_app_info_len); 2143 hidl_ind->V1_0.status.status = 2144 convertLegacyNanStatusTypeToHidl(legacy_ind.reason_code); 2145 hidl_ind->V1_0.status.description = ""; // TODO: b/34059183 2146 2147 std::vector<V1_2::NanDataPathChannelInfo> channelInfo; 2148 for (unsigned int i = 0; i < legacy_ind.num_channels; ++i) { 2149 V1_2::NanDataPathChannelInfo hidl_struct; 2150 if (!convertLegacyNdpChannelInfoToHidl(legacy_ind.channel_info[i], 2151 &hidl_struct)) { 2152 return false; 2153 } 2154 channelInfo.push_back(hidl_struct); 2155 } 2156 hidl_ind->channelInfo = channelInfo; 2157 2158 return true; 2159 } 2160 2161 bool convertLegacyNanDataPathScheduleUpdateIndToHidl( 2162 const legacy_hal::NanDataPathScheduleUpdateInd& legacy_ind, 2163 V1_2::NanDataPathScheduleUpdateInd* hidl_ind) { 2164 if (!hidl_ind) { 2165 LOG(ERROR) << "convertLegacyNanDataPathScheduleUpdateIndToHidl: " 2166 "hidl_ind is null"; 2167 return false; 2168 } 2169 *hidl_ind = {}; 2170 2171 hidl_ind->peerDiscoveryAddress = 2172 hidl_array<uint8_t, 6>(legacy_ind.peer_mac_addr); 2173 std::vector<V1_2::NanDataPathChannelInfo> channelInfo; 2174 for (unsigned int i = 0; i < legacy_ind.num_channels; ++i) { 2175 V1_2::NanDataPathChannelInfo hidl_struct; 2176 if (!convertLegacyNdpChannelInfoToHidl(legacy_ind.channel_info[i], 2177 &hidl_struct)) { 2178 return false; 2179 } 2180 channelInfo.push_back(hidl_struct); 2181 } 2182 hidl_ind->channelInfo = channelInfo; 2183 std::vector<uint32_t> ndpInstanceIds; 2184 for (unsigned int i = 0; i < legacy_ind.num_ndp_instances; ++i) { 2185 ndpInstanceIds.push_back(legacy_ind.ndp_instance_id[i]); 2186 } 2187 hidl_ind->ndpInstanceIds = ndpInstanceIds; 2188 2189 return true; 2190 } 2191 2192 legacy_hal::wifi_rtt_type convertHidlRttTypeToLegacy(RttType type) { 2193 switch (type) { 2194 case RttType::ONE_SIDED: 2195 return legacy_hal::RTT_TYPE_1_SIDED; 2196 case RttType::TWO_SIDED: 2197 return legacy_hal::RTT_TYPE_2_SIDED; 2198 }; 2199 CHECK(false); 2200 } 2201 2202 RttType convertLegacyRttTypeToHidl(legacy_hal::wifi_rtt_type type) { 2203 switch (type) { 2204 case legacy_hal::RTT_TYPE_1_SIDED: 2205 return RttType::ONE_SIDED; 2206 case legacy_hal::RTT_TYPE_2_SIDED: 2207 return RttType::TWO_SIDED; 2208 }; 2209 CHECK(false) << "Unknown legacy type: " << type; 2210 } 2211 2212 legacy_hal::rtt_peer_type convertHidlRttPeerTypeToLegacy(RttPeerType type) { 2213 switch (type) { 2214 case RttPeerType::AP: 2215 return legacy_hal::RTT_PEER_AP; 2216 case RttPeerType::STA: 2217 return legacy_hal::RTT_PEER_STA; 2218 case RttPeerType::P2P_GO: 2219 return legacy_hal::RTT_PEER_P2P_GO; 2220 case RttPeerType::P2P_CLIENT: 2221 return legacy_hal::RTT_PEER_P2P_CLIENT; 2222 case RttPeerType::NAN: 2223 return legacy_hal::RTT_PEER_NAN; 2224 }; 2225 CHECK(false); 2226 } 2227 2228 legacy_hal::wifi_channel_width convertHidlWifiChannelWidthToLegacy( 2229 WifiChannelWidthInMhz type) { 2230 switch (type) { 2231 case WifiChannelWidthInMhz::WIDTH_20: 2232 return legacy_hal::WIFI_CHAN_WIDTH_20; 2233 case WifiChannelWidthInMhz::WIDTH_40: 2234 return legacy_hal::WIFI_CHAN_WIDTH_40; 2235 case WifiChannelWidthInMhz::WIDTH_80: 2236 return legacy_hal::WIFI_CHAN_WIDTH_80; 2237 case WifiChannelWidthInMhz::WIDTH_160: 2238 return legacy_hal::WIFI_CHAN_WIDTH_160; 2239 case WifiChannelWidthInMhz::WIDTH_80P80: 2240 return legacy_hal::WIFI_CHAN_WIDTH_80P80; 2241 case WifiChannelWidthInMhz::WIDTH_5: 2242 return legacy_hal::WIFI_CHAN_WIDTH_5; 2243 case WifiChannelWidthInMhz::WIDTH_10: 2244 return legacy_hal::WIFI_CHAN_WIDTH_10; 2245 case WifiChannelWidthInMhz::WIDTH_INVALID: 2246 return legacy_hal::WIFI_CHAN_WIDTH_INVALID; 2247 }; 2248 CHECK(false); 2249 } 2250 2251 WifiChannelWidthInMhz convertLegacyWifiChannelWidthToHidl( 2252 legacy_hal::wifi_channel_width type) { 2253 switch (type) { 2254 case legacy_hal::WIFI_CHAN_WIDTH_20: 2255 return WifiChannelWidthInMhz::WIDTH_20; 2256 case legacy_hal::WIFI_CHAN_WIDTH_40: 2257 return WifiChannelWidthInMhz::WIDTH_40; 2258 case legacy_hal::WIFI_CHAN_WIDTH_80: 2259 return WifiChannelWidthInMhz::WIDTH_80; 2260 case legacy_hal::WIFI_CHAN_WIDTH_160: 2261 return WifiChannelWidthInMhz::WIDTH_160; 2262 case legacy_hal::WIFI_CHAN_WIDTH_80P80: 2263 return WifiChannelWidthInMhz::WIDTH_80P80; 2264 case legacy_hal::WIFI_CHAN_WIDTH_5: 2265 return WifiChannelWidthInMhz::WIDTH_5; 2266 case legacy_hal::WIFI_CHAN_WIDTH_10: 2267 return WifiChannelWidthInMhz::WIDTH_10; 2268 case legacy_hal::WIFI_CHAN_WIDTH_INVALID: 2269 return WifiChannelWidthInMhz::WIDTH_INVALID; 2270 }; 2271 CHECK(false) << "Unknown legacy type: " << type; 2272 } 2273 2274 legacy_hal::wifi_rtt_preamble convertHidlRttPreambleToLegacy(RttPreamble type) { 2275 switch (type) { 2276 case RttPreamble::LEGACY: 2277 return legacy_hal::WIFI_RTT_PREAMBLE_LEGACY; 2278 case RttPreamble::HT: 2279 return legacy_hal::WIFI_RTT_PREAMBLE_HT; 2280 case RttPreamble::VHT: 2281 return legacy_hal::WIFI_RTT_PREAMBLE_VHT; 2282 }; 2283 CHECK(false); 2284 } 2285 2286 RttPreamble convertLegacyRttPreambleToHidl(legacy_hal::wifi_rtt_preamble type) { 2287 switch (type) { 2288 case legacy_hal::WIFI_RTT_PREAMBLE_LEGACY: 2289 return RttPreamble::LEGACY; 2290 case legacy_hal::WIFI_RTT_PREAMBLE_HT: 2291 return RttPreamble::HT; 2292 case legacy_hal::WIFI_RTT_PREAMBLE_VHT: 2293 return RttPreamble::VHT; 2294 }; 2295 CHECK(false) << "Unknown legacy type: " << type; 2296 } 2297 2298 legacy_hal::wifi_rtt_bw convertHidlRttBwToLegacy(RttBw type) { 2299 switch (type) { 2300 case RttBw::BW_5MHZ: 2301 return legacy_hal::WIFI_RTT_BW_5; 2302 case RttBw::BW_10MHZ: 2303 return legacy_hal::WIFI_RTT_BW_10; 2304 case RttBw::BW_20MHZ: 2305 return legacy_hal::WIFI_RTT_BW_20; 2306 case RttBw::BW_40MHZ: 2307 return legacy_hal::WIFI_RTT_BW_40; 2308 case RttBw::BW_80MHZ: 2309 return legacy_hal::WIFI_RTT_BW_80; 2310 case RttBw::BW_160MHZ: 2311 return legacy_hal::WIFI_RTT_BW_160; 2312 }; 2313 CHECK(false); 2314 } 2315 2316 RttBw convertLegacyRttBwToHidl(legacy_hal::wifi_rtt_bw type) { 2317 switch (type) { 2318 case legacy_hal::WIFI_RTT_BW_5: 2319 return RttBw::BW_5MHZ; 2320 case legacy_hal::WIFI_RTT_BW_10: 2321 return RttBw::BW_10MHZ; 2322 case legacy_hal::WIFI_RTT_BW_20: 2323 return RttBw::BW_20MHZ; 2324 case legacy_hal::WIFI_RTT_BW_40: 2325 return RttBw::BW_40MHZ; 2326 case legacy_hal::WIFI_RTT_BW_80: 2327 return RttBw::BW_80MHZ; 2328 case legacy_hal::WIFI_RTT_BW_160: 2329 return RttBw::BW_160MHZ; 2330 }; 2331 CHECK(false) << "Unknown legacy type: " << type; 2332 } 2333 2334 legacy_hal::wifi_motion_pattern convertHidlRttMotionPatternToLegacy( 2335 RttMotionPattern type) { 2336 switch (type) { 2337 case RttMotionPattern::NOT_EXPECTED: 2338 return legacy_hal::WIFI_MOTION_NOT_EXPECTED; 2339 case RttMotionPattern::EXPECTED: 2340 return legacy_hal::WIFI_MOTION_EXPECTED; 2341 case RttMotionPattern::UNKNOWN: 2342 return legacy_hal::WIFI_MOTION_UNKNOWN; 2343 }; 2344 CHECK(false); 2345 } 2346 2347 WifiRatePreamble convertLegacyWifiRatePreambleToHidl(uint8_t preamble) { 2348 switch (preamble) { 2349 case 0: 2350 return WifiRatePreamble::OFDM; 2351 case 1: 2352 return WifiRatePreamble::CCK; 2353 case 2: 2354 return WifiRatePreamble::HT; 2355 case 3: 2356 return WifiRatePreamble::VHT; 2357 default: 2358 return WifiRatePreamble::RESERVED; 2359 }; 2360 CHECK(false) << "Unknown legacy preamble: " << preamble; 2361 } 2362 2363 WifiRateNss convertLegacyWifiRateNssToHidl(uint8_t nss) { 2364 switch (nss) { 2365 case 0: 2366 return WifiRateNss::NSS_1x1; 2367 case 1: 2368 return WifiRateNss::NSS_2x2; 2369 case 2: 2370 return WifiRateNss::NSS_3x3; 2371 case 3: 2372 return WifiRateNss::NSS_4x4; 2373 }; 2374 CHECK(false) << "Unknown legacy nss: " << nss; 2375 return {}; 2376 } 2377 2378 RttStatus convertLegacyRttStatusToHidl(legacy_hal::wifi_rtt_status status) { 2379 switch (status) { 2380 case legacy_hal::RTT_STATUS_SUCCESS: 2381 return RttStatus::SUCCESS; 2382 case legacy_hal::RTT_STATUS_FAILURE: 2383 return RttStatus::FAILURE; 2384 case legacy_hal::RTT_STATUS_FAIL_NO_RSP: 2385 return RttStatus::FAIL_NO_RSP; 2386 case legacy_hal::RTT_STATUS_FAIL_REJECTED: 2387 return RttStatus::FAIL_REJECTED; 2388 case legacy_hal::RTT_STATUS_FAIL_NOT_SCHEDULED_YET: 2389 return RttStatus::FAIL_NOT_SCHEDULED_YET; 2390 case legacy_hal::RTT_STATUS_FAIL_TM_TIMEOUT: 2391 return RttStatus::FAIL_TM_TIMEOUT; 2392 case legacy_hal::RTT_STATUS_FAIL_AP_ON_DIFF_CHANNEL: 2393 return RttStatus::FAIL_AP_ON_DIFF_CHANNEL; 2394 case legacy_hal::RTT_STATUS_FAIL_NO_CAPABILITY: 2395 return RttStatus::FAIL_NO_CAPABILITY; 2396 case legacy_hal::RTT_STATUS_ABORTED: 2397 return RttStatus::ABORTED; 2398 case legacy_hal::RTT_STATUS_FAIL_INVALID_TS: 2399 return RttStatus::FAIL_INVALID_TS; 2400 case legacy_hal::RTT_STATUS_FAIL_PROTOCOL: 2401 return RttStatus::FAIL_PROTOCOL; 2402 case legacy_hal::RTT_STATUS_FAIL_SCHEDULE: 2403 return RttStatus::FAIL_SCHEDULE; 2404 case legacy_hal::RTT_STATUS_FAIL_BUSY_TRY_LATER: 2405 return RttStatus::FAIL_BUSY_TRY_LATER; 2406 case legacy_hal::RTT_STATUS_INVALID_REQ: 2407 return RttStatus::INVALID_REQ; 2408 case legacy_hal::RTT_STATUS_NO_WIFI: 2409 return RttStatus::NO_WIFI; 2410 case legacy_hal::RTT_STATUS_FAIL_FTM_PARAM_OVERRIDE: 2411 return RttStatus::FAIL_FTM_PARAM_OVERRIDE; 2412 case legacy_hal::RTT_STATUS_NAN_RANGING_PROTOCOL_FAILURE: 2413 return RttStatus::FAILURE; // TODO: add HIDL enumeration 2414 case legacy_hal::RTT_STATUS_NAN_RANGING_CONCURRENCY_NOT_SUPPORTED: 2415 return RttStatus::FAILURE; // TODO: add HIDL enumeration 2416 }; 2417 CHECK(false) << "Unknown legacy status: " << status; 2418 } 2419 2420 bool convertHidlWifiChannelInfoToLegacy( 2421 const WifiChannelInfo& hidl_info, 2422 legacy_hal::wifi_channel_info* legacy_info) { 2423 if (!legacy_info) { 2424 return false; 2425 } 2426 *legacy_info = {}; 2427 legacy_info->width = convertHidlWifiChannelWidthToLegacy(hidl_info.width); 2428 legacy_info->center_freq = hidl_info.centerFreq; 2429 legacy_info->center_freq0 = hidl_info.centerFreq0; 2430 legacy_info->center_freq1 = hidl_info.centerFreq1; 2431 return true; 2432 } 2433 2434 bool convertLegacyWifiChannelInfoToHidl( 2435 const legacy_hal::wifi_channel_info& legacy_info, 2436 WifiChannelInfo* hidl_info) { 2437 if (!hidl_info) { 2438 return false; 2439 } 2440 *hidl_info = {}; 2441 hidl_info->width = convertLegacyWifiChannelWidthToHidl(legacy_info.width); 2442 hidl_info->centerFreq = legacy_info.center_freq; 2443 hidl_info->centerFreq0 = legacy_info.center_freq0; 2444 hidl_info->centerFreq1 = legacy_info.center_freq1; 2445 return true; 2446 } 2447 2448 bool convertHidlRttConfigToLegacy(const RttConfig& hidl_config, 2449 legacy_hal::wifi_rtt_config* legacy_config) { 2450 if (!legacy_config) { 2451 return false; 2452 } 2453 *legacy_config = {}; 2454 CHECK(hidl_config.addr.size() == sizeof(legacy_config->addr)); 2455 memcpy(legacy_config->addr, hidl_config.addr.data(), 2456 hidl_config.addr.size()); 2457 legacy_config->type = convertHidlRttTypeToLegacy(hidl_config.type); 2458 legacy_config->peer = convertHidlRttPeerTypeToLegacy(hidl_config.peer); 2459 if (!convertHidlWifiChannelInfoToLegacy(hidl_config.channel, 2460 &legacy_config->channel)) { 2461 return false; 2462 } 2463 legacy_config->burst_period = hidl_config.burstPeriod; 2464 legacy_config->num_burst = hidl_config.numBurst; 2465 legacy_config->num_frames_per_burst = hidl_config.numFramesPerBurst; 2466 legacy_config->num_retries_per_rtt_frame = 2467 hidl_config.numRetriesPerRttFrame; 2468 legacy_config->num_retries_per_ftmr = hidl_config.numRetriesPerFtmr; 2469 legacy_config->LCI_request = hidl_config.mustRequestLci; 2470 legacy_config->LCR_request = hidl_config.mustRequestLcr; 2471 legacy_config->burst_duration = hidl_config.burstDuration; 2472 legacy_config->preamble = 2473 convertHidlRttPreambleToLegacy(hidl_config.preamble); 2474 legacy_config->bw = convertHidlRttBwToLegacy(hidl_config.bw); 2475 return true; 2476 } 2477 2478 bool convertHidlVectorOfRttConfigToLegacy( 2479 const std::vector<RttConfig>& hidl_configs, 2480 std::vector<legacy_hal::wifi_rtt_config>* legacy_configs) { 2481 if (!legacy_configs) { 2482 return false; 2483 } 2484 *legacy_configs = {}; 2485 for (const auto& hidl_config : hidl_configs) { 2486 legacy_hal::wifi_rtt_config legacy_config; 2487 if (!convertHidlRttConfigToLegacy(hidl_config, &legacy_config)) { 2488 return false; 2489 } 2490 legacy_configs->push_back(legacy_config); 2491 } 2492 return true; 2493 } 2494 2495 bool convertHidlRttLciInformationToLegacy( 2496 const RttLciInformation& hidl_info, 2497 legacy_hal::wifi_lci_information* legacy_info) { 2498 if (!legacy_info) { 2499 return false; 2500 } 2501 *legacy_info = {}; 2502 legacy_info->latitude = hidl_info.latitude; 2503 legacy_info->longitude = hidl_info.longitude; 2504 legacy_info->altitude = hidl_info.altitude; 2505 legacy_info->latitude_unc = hidl_info.latitudeUnc; 2506 legacy_info->longitude_unc = hidl_info.longitudeUnc; 2507 legacy_info->altitude_unc = hidl_info.altitudeUnc; 2508 legacy_info->motion_pattern = 2509 convertHidlRttMotionPatternToLegacy(hidl_info.motionPattern); 2510 legacy_info->floor = hidl_info.floor; 2511 legacy_info->height_above_floor = hidl_info.heightAboveFloor; 2512 legacy_info->height_unc = hidl_info.heightUnc; 2513 return true; 2514 } 2515 2516 bool convertHidlRttLcrInformationToLegacy( 2517 const RttLcrInformation& hidl_info, 2518 legacy_hal::wifi_lcr_information* legacy_info) { 2519 if (!legacy_info) { 2520 return false; 2521 } 2522 *legacy_info = {}; 2523 CHECK(hidl_info.countryCode.size() == sizeof(legacy_info->country_code)); 2524 memcpy(legacy_info->country_code, hidl_info.countryCode.data(), 2525 hidl_info.countryCode.size()); 2526 if (hidl_info.civicInfo.size() > sizeof(legacy_info->civic_info)) { 2527 return false; 2528 } 2529 legacy_info->length = hidl_info.civicInfo.size(); 2530 memcpy(legacy_info->civic_info, hidl_info.civicInfo.c_str(), 2531 hidl_info.civicInfo.size()); 2532 return true; 2533 } 2534 2535 bool convertHidlRttResponderToLegacy( 2536 const RttResponder& hidl_responder, 2537 legacy_hal::wifi_rtt_responder* legacy_responder) { 2538 if (!legacy_responder) { 2539 return false; 2540 } 2541 *legacy_responder = {}; 2542 if (!convertHidlWifiChannelInfoToLegacy(hidl_responder.channel, 2543 &legacy_responder->channel)) { 2544 return false; 2545 } 2546 legacy_responder->preamble = 2547 convertHidlRttPreambleToLegacy(hidl_responder.preamble); 2548 return true; 2549 } 2550 2551 bool convertLegacyRttResponderToHidl( 2552 const legacy_hal::wifi_rtt_responder& legacy_responder, 2553 RttResponder* hidl_responder) { 2554 if (!hidl_responder) { 2555 return false; 2556 } 2557 *hidl_responder = {}; 2558 if (!convertLegacyWifiChannelInfoToHidl(legacy_responder.channel, 2559 &hidl_responder->channel)) { 2560 return false; 2561 } 2562 hidl_responder->preamble = 2563 convertLegacyRttPreambleToHidl(legacy_responder.preamble); 2564 return true; 2565 } 2566 2567 bool convertLegacyRttCapabilitiesToHidl( 2568 const legacy_hal::wifi_rtt_capabilities& legacy_capabilities, 2569 RttCapabilities* hidl_capabilities) { 2570 if (!hidl_capabilities) { 2571 return false; 2572 } 2573 *hidl_capabilities = {}; 2574 hidl_capabilities->rttOneSidedSupported = 2575 legacy_capabilities.rtt_one_sided_supported; 2576 hidl_capabilities->rttFtmSupported = legacy_capabilities.rtt_ftm_supported; 2577 hidl_capabilities->lciSupported = legacy_capabilities.lci_support; 2578 hidl_capabilities->lcrSupported = legacy_capabilities.lcr_support; 2579 hidl_capabilities->responderSupported = 2580 legacy_capabilities.responder_supported; 2581 hidl_capabilities->preambleSupport = 0; 2582 for (const auto flag : {legacy_hal::WIFI_RTT_PREAMBLE_LEGACY, 2583 legacy_hal::WIFI_RTT_PREAMBLE_HT, 2584 legacy_hal::WIFI_RTT_PREAMBLE_VHT}) { 2585 if (legacy_capabilities.preamble_support & flag) { 2586 hidl_capabilities->preambleSupport |= 2587 static_cast<std::underlying_type<RttPreamble>::type>( 2588 convertLegacyRttPreambleToHidl(flag)); 2589 } 2590 } 2591 hidl_capabilities->bwSupport = 0; 2592 for (const auto flag : 2593 {legacy_hal::WIFI_RTT_BW_5, legacy_hal::WIFI_RTT_BW_10, 2594 legacy_hal::WIFI_RTT_BW_20, legacy_hal::WIFI_RTT_BW_40, 2595 legacy_hal::WIFI_RTT_BW_80, legacy_hal::WIFI_RTT_BW_160}) { 2596 if (legacy_capabilities.bw_support & flag) { 2597 hidl_capabilities->bwSupport |= 2598 static_cast<std::underlying_type<RttBw>::type>( 2599 convertLegacyRttBwToHidl(flag)); 2600 } 2601 } 2602 hidl_capabilities->mcVersion = legacy_capabilities.mc_version; 2603 return true; 2604 } 2605 2606 bool convertLegacyWifiRateInfoToHidl(const legacy_hal::wifi_rate& legacy_rate, 2607 WifiRateInfo* hidl_rate) { 2608 if (!hidl_rate) { 2609 return false; 2610 } 2611 *hidl_rate = {}; 2612 hidl_rate->preamble = 2613 convertLegacyWifiRatePreambleToHidl(legacy_rate.preamble); 2614 hidl_rate->nss = convertLegacyWifiRateNssToHidl(legacy_rate.nss); 2615 hidl_rate->bw = convertLegacyWifiChannelWidthToHidl( 2616 static_cast<legacy_hal::wifi_channel_width>(legacy_rate.bw)); 2617 hidl_rate->rateMcsIdx = legacy_rate.rateMcsIdx; 2618 hidl_rate->bitRateInKbps = legacy_rate.bitrate; 2619 return true; 2620 } 2621 2622 bool convertLegacyRttResultToHidl( 2623 const legacy_hal::wifi_rtt_result& legacy_result, RttResult* hidl_result) { 2624 if (!hidl_result) { 2625 return false; 2626 } 2627 *hidl_result = {}; 2628 CHECK(sizeof(legacy_result.addr) == hidl_result->addr.size()); 2629 memcpy(hidl_result->addr.data(), legacy_result.addr, 2630 sizeof(legacy_result.addr)); 2631 hidl_result->burstNum = legacy_result.burst_num; 2632 hidl_result->measurementNumber = legacy_result.measurement_number; 2633 hidl_result->successNumber = legacy_result.success_number; 2634 hidl_result->numberPerBurstPeer = legacy_result.number_per_burst_peer; 2635 hidl_result->status = convertLegacyRttStatusToHidl(legacy_result.status); 2636 hidl_result->retryAfterDuration = legacy_result.retry_after_duration; 2637 hidl_result->type = convertLegacyRttTypeToHidl(legacy_result.type); 2638 hidl_result->rssi = legacy_result.rssi; 2639 hidl_result->rssiSpread = legacy_result.rssi_spread; 2640 if (!convertLegacyWifiRateInfoToHidl(legacy_result.tx_rate, 2641 &hidl_result->txRate)) { 2642 return false; 2643 } 2644 if (!convertLegacyWifiRateInfoToHidl(legacy_result.rx_rate, 2645 &hidl_result->rxRate)) { 2646 return false; 2647 } 2648 hidl_result->rtt = legacy_result.rtt; 2649 hidl_result->rttSd = legacy_result.rtt_sd; 2650 hidl_result->rttSpread = legacy_result.rtt_spread; 2651 hidl_result->distanceInMm = legacy_result.distance_mm; 2652 hidl_result->distanceSdInMm = legacy_result.distance_sd_mm; 2653 hidl_result->distanceSpreadInMm = legacy_result.distance_spread_mm; 2654 hidl_result->timeStampInUs = legacy_result.ts; 2655 hidl_result->burstDurationInMs = legacy_result.burst_duration; 2656 hidl_result->negotiatedBurstNum = legacy_result.negotiated_burst_num; 2657 if (legacy_result.LCI && 2658 !convertLegacyIeToHidl(*legacy_result.LCI, &hidl_result->lci)) { 2659 return false; 2660 } 2661 if (legacy_result.LCR && 2662 !convertLegacyIeToHidl(*legacy_result.LCR, &hidl_result->lcr)) { 2663 return false; 2664 } 2665 return true; 2666 } 2667 2668 bool convertLegacyVectorOfRttResultToHidl( 2669 const std::vector<const legacy_hal::wifi_rtt_result*>& legacy_results, 2670 std::vector<RttResult>* hidl_results) { 2671 if (!hidl_results) { 2672 return false; 2673 } 2674 *hidl_results = {}; 2675 for (const auto legacy_result : legacy_results) { 2676 RttResult hidl_result; 2677 if (!convertLegacyRttResultToHidl(*legacy_result, &hidl_result)) { 2678 return false; 2679 } 2680 hidl_results->push_back(hidl_result); 2681 } 2682 return true; 2683 } 2684 } // namespace hidl_struct_util 2685 } // namespace implementation 2686 } // namespace V1_3 2687 } // namespace wifi 2688 } // namespace hardware 2689 } // namespace android 2690