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