1 /*
2 * Copyright (C) 2017, 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 <android-base/macros.h>
19 #include <gmock/gmock.h>
20
21 #undef NAN
22 #include "hidl_struct_util.h"
23
24 using testing::Test;
25
26 namespace {
27 constexpr uint32_t kMacId1 = 1;
28 constexpr uint32_t kMacId2 = 2;
29 constexpr uint32_t kIfaceChannel1 = 3;
30 constexpr uint32_t kIfaceChannel2 = 5;
31 constexpr char kIfaceName1[] = "wlan0";
32 constexpr char kIfaceName2[] = "wlan1";
33 } // namespace
34 namespace android {
35 namespace hardware {
36 namespace wifi {
37 namespace V1_6 {
38 namespace implementation {
39 using namespace android::hardware::wifi::V1_0;
40 using ::android::hardware::wifi::V1_6::WifiChannelWidthInMhz;
41
42 class HidlStructUtilTest : public Test {};
43
TEST_F(HidlStructUtilTest,CanConvertLegacyWifiMacInfosToHidlWithOneMac)44 TEST_F(HidlStructUtilTest, CanConvertLegacyWifiMacInfosToHidlWithOneMac) {
45 std::vector<legacy_hal::WifiMacInfo> legacy_mac_infos;
46 legacy_hal::WifiMacInfo legacy_mac_info1 = {
47 .wlan_mac_id = kMacId1,
48 .mac_band = legacy_hal::WLAN_MAC_5_0_BAND | legacy_hal::WLAN_MAC_2_4_BAND};
49 legacy_hal::WifiIfaceInfo legacy_iface_info1 = {.name = kIfaceName1, .channel = kIfaceChannel1};
50 legacy_hal::WifiIfaceInfo legacy_iface_info2 = {.name = kIfaceName2, .channel = kIfaceChannel2};
51 legacy_mac_info1.iface_infos.push_back(legacy_iface_info1);
52 legacy_mac_info1.iface_infos.push_back(legacy_iface_info2);
53 legacy_mac_infos.push_back(legacy_mac_info1);
54
55 std::vector<V1_4::IWifiChipEventCallback::RadioModeInfo> hidl_radio_mode_infos;
56 ASSERT_TRUE(hidl_struct_util::convertLegacyWifiMacInfosToHidl(legacy_mac_infos,
57 &hidl_radio_mode_infos));
58
59 ASSERT_EQ(1u, hidl_radio_mode_infos.size());
60 auto hidl_radio_mode_info1 = hidl_radio_mode_infos[0];
61 EXPECT_EQ(legacy_mac_info1.wlan_mac_id, hidl_radio_mode_info1.radioId);
62 EXPECT_EQ(V1_4::WifiBand::BAND_24GHZ_5GHZ, hidl_radio_mode_info1.bandInfo);
63 ASSERT_EQ(2u, hidl_radio_mode_info1.ifaceInfos.size());
64 auto hidl_iface_info1 = hidl_radio_mode_info1.ifaceInfos[0];
65 EXPECT_EQ(legacy_iface_info1.name, hidl_iface_info1.name);
66 EXPECT_EQ(static_cast<uint32_t>(legacy_iface_info1.channel), hidl_iface_info1.channel);
67 auto hidl_iface_info2 = hidl_radio_mode_info1.ifaceInfos[1];
68 EXPECT_EQ(legacy_iface_info2.name, hidl_iface_info2.name);
69 EXPECT_EQ(static_cast<uint32_t>(legacy_iface_info2.channel), hidl_iface_info2.channel);
70 }
71
TEST_F(HidlStructUtilTest,CanConvertLegacyWifiMacInfosToHidlWithTwoMac)72 TEST_F(HidlStructUtilTest, CanConvertLegacyWifiMacInfosToHidlWithTwoMac) {
73 std::vector<legacy_hal::WifiMacInfo> legacy_mac_infos;
74 legacy_hal::WifiMacInfo legacy_mac_info1 = {.wlan_mac_id = kMacId1,
75 .mac_band = legacy_hal::WLAN_MAC_5_0_BAND};
76 legacy_hal::WifiIfaceInfo legacy_iface_info1 = {.name = kIfaceName1, .channel = kIfaceChannel1};
77 legacy_hal::WifiMacInfo legacy_mac_info2 = {.wlan_mac_id = kMacId2,
78 .mac_band = legacy_hal::WLAN_MAC_2_4_BAND};
79 legacy_hal::WifiIfaceInfo legacy_iface_info2 = {.name = kIfaceName2, .channel = kIfaceChannel2};
80 legacy_mac_info1.iface_infos.push_back(legacy_iface_info1);
81 legacy_mac_infos.push_back(legacy_mac_info1);
82 legacy_mac_info2.iface_infos.push_back(legacy_iface_info2);
83 legacy_mac_infos.push_back(legacy_mac_info2);
84
85 std::vector<V1_4::IWifiChipEventCallback::RadioModeInfo> hidl_radio_mode_infos;
86 ASSERT_TRUE(hidl_struct_util::convertLegacyWifiMacInfosToHidl(legacy_mac_infos,
87 &hidl_radio_mode_infos));
88
89 ASSERT_EQ(2u, hidl_radio_mode_infos.size());
90
91 // Find mac info 1.
92 const auto hidl_radio_mode_info1 =
93 std::find_if(hidl_radio_mode_infos.begin(), hidl_radio_mode_infos.end(),
94 [&legacy_mac_info1](const V1_4::IWifiChipEventCallback::RadioModeInfo& x) {
95 return x.radioId == legacy_mac_info1.wlan_mac_id;
96 });
97 ASSERT_NE(hidl_radio_mode_infos.end(), hidl_radio_mode_info1);
98 EXPECT_EQ(V1_4::WifiBand::BAND_5GHZ, hidl_radio_mode_info1->bandInfo);
99 ASSERT_EQ(1u, hidl_radio_mode_info1->ifaceInfos.size());
100 auto hidl_iface_info1 = hidl_radio_mode_info1->ifaceInfos[0];
101 EXPECT_EQ(legacy_iface_info1.name, hidl_iface_info1.name);
102 EXPECT_EQ(static_cast<uint32_t>(legacy_iface_info1.channel), hidl_iface_info1.channel);
103
104 // Find mac info 2.
105 const auto hidl_radio_mode_info2 =
106 std::find_if(hidl_radio_mode_infos.begin(), hidl_radio_mode_infos.end(),
107 [&legacy_mac_info2](const V1_4::IWifiChipEventCallback::RadioModeInfo& x) {
108 return x.radioId == legacy_mac_info2.wlan_mac_id;
109 });
110 ASSERT_NE(hidl_radio_mode_infos.end(), hidl_radio_mode_info2);
111 EXPECT_EQ(V1_4::WifiBand::BAND_24GHZ, hidl_radio_mode_info2->bandInfo);
112 ASSERT_EQ(1u, hidl_radio_mode_info2->ifaceInfos.size());
113 auto hidl_iface_info2 = hidl_radio_mode_info2->ifaceInfos[0];
114 EXPECT_EQ(legacy_iface_info2.name, hidl_iface_info2.name);
115 EXPECT_EQ(static_cast<uint32_t>(legacy_iface_info2.channel), hidl_iface_info2.channel);
116 }
117
TEST_F(HidlStructUtilTest,canConvertLegacyLinkLayerStatsToHidl)118 TEST_F(HidlStructUtilTest, canConvertLegacyLinkLayerStatsToHidl) {
119 legacy_hal::LinkLayerStats legacy_stats{};
120 legacy_stats.radios.push_back(legacy_hal::LinkLayerRadioStats{});
121 legacy_stats.radios.push_back(legacy_hal::LinkLayerRadioStats{});
122 legacy_stats.peers.push_back(legacy_hal::WifiPeerInfo{});
123 legacy_stats.peers.push_back(legacy_hal::WifiPeerInfo{});
124 legacy_stats.iface.beacon_rx = rand();
125 legacy_stats.iface.rssi_mgmt = rand();
126 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].rx_mpdu = rand();
127 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].tx_mpdu = rand();
128 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].mpdu_lost = rand();
129 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].retries = rand();
130 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].contention_time_min = rand();
131 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].contention_time_max = rand();
132 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].contention_time_avg = rand();
133 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].contention_num_samples = rand();
134
135 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].rx_mpdu = rand();
136 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].tx_mpdu = rand();
137 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].mpdu_lost = rand();
138 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].retries = rand();
139 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].contention_time_min = rand();
140 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].contention_time_max = rand();
141 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].contention_time_avg = rand();
142 legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].contention_num_samples = rand();
143
144 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].rx_mpdu = rand();
145 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].tx_mpdu = rand();
146 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].mpdu_lost = rand();
147 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].retries = rand();
148 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].contention_time_min = rand();
149 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].contention_time_max = rand();
150 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].contention_time_avg = rand();
151 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].contention_num_samples = rand();
152
153 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].rx_mpdu = rand();
154 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].tx_mpdu = rand();
155 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].mpdu_lost = rand();
156 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].retries = rand();
157 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].contention_time_min = rand();
158 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].contention_time_max = rand();
159 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].contention_time_avg = rand();
160 legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].contention_num_samples = rand();
161
162 legacy_stats.iface.info.time_slicing_duty_cycle_percent = rand();
163 legacy_stats.iface.num_peers = 1;
164
165 for (auto& radio : legacy_stats.radios) {
166 radio.stats.radio = rand();
167 radio.stats.on_time = rand();
168 radio.stats.tx_time = rand();
169 radio.stats.rx_time = rand();
170 radio.stats.on_time_scan = rand();
171 radio.stats.on_time_nbd = rand();
172 radio.stats.on_time_gscan = rand();
173 radio.stats.on_time_roam_scan = rand();
174 radio.stats.on_time_pno_scan = rand();
175 radio.stats.on_time_hs20 = rand();
176 for (int i = 0; i < 4; i++) {
177 radio.tx_time_per_levels.push_back(rand());
178 }
179
180 legacy_hal::wifi_channel_stat channel_stat1 = {
181 .channel = {legacy_hal::WIFI_CHAN_WIDTH_20, 2437, 2437, 0},
182 .on_time = 0x1111,
183 .cca_busy_time = 0x55,
184 };
185 legacy_hal::wifi_channel_stat channel_stat2 = {
186 .channel = {legacy_hal::WIFI_CHAN_WIDTH_20, 5180, 5180, 0},
187 .on_time = 0x2222,
188 .cca_busy_time = 0x66,
189 };
190 radio.channel_stats.push_back(channel_stat1);
191 radio.channel_stats.push_back(channel_stat2);
192 }
193
194 for (auto& peer : legacy_stats.peers) {
195 peer.peer_info.bssload.sta_count = rand();
196 peer.peer_info.bssload.chan_util = rand();
197 wifi_rate_stat rate_stat1 = {
198 .rate = {3, 1, 2, 5, 0, 0},
199 .tx_mpdu = 0,
200 .rx_mpdu = 1,
201 .mpdu_lost = 2,
202 .retries = 3,
203 .retries_short = 4,
204 .retries_long = 5,
205 };
206 wifi_rate_stat rate_stat2 = {
207 .rate = {2, 2, 1, 6, 0, 1},
208 .tx_mpdu = 6,
209 .rx_mpdu = 7,
210 .mpdu_lost = 8,
211 .retries = 9,
212 .retries_short = 10,
213 .retries_long = 11,
214 };
215 peer.rate_stats.push_back(rate_stat1);
216 peer.rate_stats.push_back(rate_stat2);
217 }
218
219 V1_6::StaLinkLayerStats converted{};
220 hidl_struct_util::convertLegacyLinkLayerStatsToHidl(legacy_stats, &converted);
221 EXPECT_EQ(legacy_stats.iface.beacon_rx, converted.iface.V1_0.beaconRx);
222 EXPECT_EQ(legacy_stats.iface.rssi_mgmt, converted.iface.V1_0.avgRssiMgmt);
223 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].rx_mpdu,
224 converted.iface.V1_0.wmeBePktStats.rxMpdu);
225 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].tx_mpdu,
226 converted.iface.V1_0.wmeBePktStats.txMpdu);
227 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].mpdu_lost,
228 converted.iface.V1_0.wmeBePktStats.lostMpdu);
229 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].retries,
230 converted.iface.V1_0.wmeBePktStats.retries);
231 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].contention_time_min,
232 converted.iface.wmeBeContentionTimeStats.contentionTimeMinInUsec);
233 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].contention_time_max,
234 converted.iface.wmeBeContentionTimeStats.contentionTimeMaxInUsec);
235 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].contention_time_avg,
236 converted.iface.wmeBeContentionTimeStats.contentionTimeAvgInUsec);
237 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].contention_num_samples,
238 converted.iface.wmeBeContentionTimeStats.contentionNumSamples);
239
240 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].rx_mpdu,
241 converted.iface.V1_0.wmeBkPktStats.rxMpdu);
242 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].tx_mpdu,
243 converted.iface.V1_0.wmeBkPktStats.txMpdu);
244 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].mpdu_lost,
245 converted.iface.V1_0.wmeBkPktStats.lostMpdu);
246 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].retries,
247 converted.iface.V1_0.wmeBkPktStats.retries);
248 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].contention_time_min,
249 converted.iface.wmeBkContentionTimeStats.contentionTimeMinInUsec);
250 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].contention_time_max,
251 converted.iface.wmeBkContentionTimeStats.contentionTimeMaxInUsec);
252 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].contention_time_avg,
253 converted.iface.wmeBkContentionTimeStats.contentionTimeAvgInUsec);
254 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].contention_num_samples,
255 converted.iface.wmeBkContentionTimeStats.contentionNumSamples);
256
257 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].rx_mpdu,
258 converted.iface.V1_0.wmeViPktStats.rxMpdu);
259 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].tx_mpdu,
260 converted.iface.V1_0.wmeViPktStats.txMpdu);
261 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].mpdu_lost,
262 converted.iface.V1_0.wmeViPktStats.lostMpdu);
263 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].retries,
264 converted.iface.V1_0.wmeViPktStats.retries);
265 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].contention_time_min,
266 converted.iface.wmeViContentionTimeStats.contentionTimeMinInUsec);
267 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].contention_time_max,
268 converted.iface.wmeViContentionTimeStats.contentionTimeMaxInUsec);
269 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].contention_time_avg,
270 converted.iface.wmeViContentionTimeStats.contentionTimeAvgInUsec);
271 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].contention_num_samples,
272 converted.iface.wmeViContentionTimeStats.contentionNumSamples);
273
274 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].rx_mpdu,
275 converted.iface.V1_0.wmeVoPktStats.rxMpdu);
276 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].tx_mpdu,
277 converted.iface.V1_0.wmeVoPktStats.txMpdu);
278 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].mpdu_lost,
279 converted.iface.V1_0.wmeVoPktStats.lostMpdu);
280 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].retries,
281 converted.iface.V1_0.wmeVoPktStats.retries);
282 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].contention_time_min,
283 converted.iface.wmeVoContentionTimeStats.contentionTimeMinInUsec);
284 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].contention_time_max,
285 converted.iface.wmeVoContentionTimeStats.contentionTimeMaxInUsec);
286 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].contention_time_avg,
287 converted.iface.wmeVoContentionTimeStats.contentionTimeAvgInUsec);
288 EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].contention_num_samples,
289 converted.iface.wmeVoContentionTimeStats.contentionNumSamples);
290
291 EXPECT_EQ(legacy_stats.iface.info.time_slicing_duty_cycle_percent,
292 converted.iface.timeSliceDutyCycleInPercent);
293
294 EXPECT_EQ(legacy_stats.radios.size(), converted.radios.size());
295 for (size_t i = 0; i < legacy_stats.radios.size(); i++) {
296 EXPECT_EQ(legacy_stats.radios[i].stats.radio, converted.radios[i].radioId);
297 EXPECT_EQ(legacy_stats.radios[i].stats.on_time, converted.radios[i].V1_0.onTimeInMs);
298 EXPECT_EQ(legacy_stats.radios[i].stats.tx_time, converted.radios[i].V1_0.txTimeInMs);
299 EXPECT_EQ(legacy_stats.radios[i].stats.rx_time, converted.radios[i].V1_0.rxTimeInMs);
300 EXPECT_EQ(legacy_stats.radios[i].stats.on_time_scan,
301 converted.radios[i].V1_0.onTimeInMsForScan);
302 EXPECT_EQ(legacy_stats.radios[i].tx_time_per_levels.size(),
303 converted.radios[i].V1_0.txTimeInMsPerLevel.size());
304 for (size_t j = 0; j < legacy_stats.radios[i].tx_time_per_levels.size(); j++) {
305 EXPECT_EQ(legacy_stats.radios[i].tx_time_per_levels[j],
306 converted.radios[i].V1_0.txTimeInMsPerLevel[j]);
307 }
308 EXPECT_EQ(legacy_stats.radios[i].stats.on_time_nbd,
309 converted.radios[i].onTimeInMsForNanScan);
310 EXPECT_EQ(legacy_stats.radios[i].stats.on_time_gscan,
311 converted.radios[i].onTimeInMsForBgScan);
312 EXPECT_EQ(legacy_stats.radios[i].stats.on_time_roam_scan,
313 converted.radios[i].onTimeInMsForRoamScan);
314 EXPECT_EQ(legacy_stats.radios[i].stats.on_time_pno_scan,
315 converted.radios[i].onTimeInMsForPnoScan);
316 EXPECT_EQ(legacy_stats.radios[i].stats.on_time_hs20,
317 converted.radios[i].onTimeInMsForHs20Scan);
318 EXPECT_EQ(legacy_stats.radios[i].channel_stats.size(),
319 converted.radios[i].channelStats.size());
320 for (size_t k = 0; k < legacy_stats.radios[i].channel_stats.size(); k++) {
321 auto& legacy_channel_st = legacy_stats.radios[i].channel_stats[k];
322 EXPECT_EQ(WifiChannelWidthInMhz::WIDTH_20,
323 converted.radios[i].channelStats[k].channel.width);
324 EXPECT_EQ(WifiChannelInMhz(legacy_channel_st.channel.center_freq),
325 converted.radios[i].channelStats[k].channel.centerFreq);
326 EXPECT_EQ(WifiChannelInMhz(legacy_channel_st.channel.center_freq0),
327 converted.radios[i].channelStats[k].channel.centerFreq0);
328 EXPECT_EQ(WifiChannelInMhz(legacy_channel_st.channel.center_freq1),
329 converted.radios[i].channelStats[k].channel.centerFreq1);
330 EXPECT_EQ(legacy_channel_st.cca_busy_time,
331 converted.radios[i].channelStats[k].ccaBusyTimeInMs);
332 EXPECT_EQ(legacy_channel_st.on_time, converted.radios[i].channelStats[k].onTimeInMs);
333 }
334 }
335
336 EXPECT_EQ(legacy_stats.peers.size(), converted.iface.peers.size());
337 for (size_t i = 0; i < legacy_stats.peers.size(); i++) {
338 EXPECT_EQ(legacy_stats.peers[i].peer_info.bssload.sta_count,
339 converted.iface.peers[i].staCount);
340 EXPECT_EQ(legacy_stats.peers[i].peer_info.bssload.chan_util,
341 converted.iface.peers[i].chanUtil);
342 for (size_t j = 0; j < legacy_stats.peers[i].rate_stats.size(); j++) {
343 EXPECT_EQ(legacy_stats.peers[i].rate_stats[j].rate.preamble,
344 (uint32_t)converted.iface.peers[i].rateStats[j].rateInfo.preamble);
345 EXPECT_EQ(legacy_stats.peers[i].rate_stats[j].rate.nss,
346 (uint32_t)converted.iface.peers[i].rateStats[j].rateInfo.nss);
347 EXPECT_EQ(legacy_stats.peers[i].rate_stats[j].rate.bw,
348 (uint32_t)converted.iface.peers[i].rateStats[j].rateInfo.bw);
349 EXPECT_EQ(legacy_stats.peers[i].rate_stats[j].rate.rateMcsIdx,
350 converted.iface.peers[i].rateStats[j].rateInfo.rateMcsIdx);
351 EXPECT_EQ(legacy_stats.peers[i].rate_stats[j].tx_mpdu,
352 converted.iface.peers[i].rateStats[j].txMpdu);
353 EXPECT_EQ(legacy_stats.peers[i].rate_stats[j].rx_mpdu,
354 converted.iface.peers[i].rateStats[j].rxMpdu);
355 EXPECT_EQ(legacy_stats.peers[i].rate_stats[j].mpdu_lost,
356 converted.iface.peers[i].rateStats[j].mpduLost);
357 EXPECT_EQ(legacy_stats.peers[i].rate_stats[j].retries,
358 converted.iface.peers[i].rateStats[j].retries);
359 }
360 }
361 }
362
TEST_F(HidlStructUtilTest,CanConvertLegacyFeaturesToHidl)363 TEST_F(HidlStructUtilTest, CanConvertLegacyFeaturesToHidl) {
364 using HidlChipCaps = V1_3::IWifiChip::ChipCapabilityMask;
365
366 uint32_t hidle_caps;
367
368 uint32_t legacy_feature_set = WIFI_FEATURE_D2D_RTT | WIFI_FEATURE_SET_LATENCY_MODE;
369 uint32_t legacy_logger_feature_set = legacy_hal::WIFI_LOGGER_DRIVER_DUMP_SUPPORTED;
370
371 ASSERT_TRUE(hidl_struct_util::convertLegacyFeaturesToHidlChipCapabilities(
372 legacy_feature_set, legacy_logger_feature_set, &hidle_caps));
373
374 EXPECT_EQ(HidlChipCaps::DEBUG_RING_BUFFER_VENDOR_DATA |
375 HidlChipCaps::DEBUG_HOST_WAKE_REASON_STATS |
376 HidlChipCaps::DEBUG_ERROR_ALERTS | HidlChipCaps::D2D_RTT |
377 HidlChipCaps::SET_LATENCY_MODE | HidlChipCaps::DEBUG_MEMORY_DRIVER_DUMP,
378 hidle_caps);
379 }
380
insertRadioCombination(legacy_hal::wifi_radio_combination * dst_radio_combination_ptr,int num_radio_configurations,legacy_hal::wifi_radio_configuration * radio_configuration)381 void insertRadioCombination(legacy_hal::wifi_radio_combination* dst_radio_combination_ptr,
382 int num_radio_configurations,
383 legacy_hal::wifi_radio_configuration* radio_configuration) {
384 dst_radio_combination_ptr->num_radio_configurations = num_radio_configurations;
385 memcpy(dst_radio_combination_ptr->radio_configurations, radio_configuration,
386 num_radio_configurations * sizeof(legacy_hal::wifi_radio_configuration));
387 }
388
verifyRadioCombination(WifiRadioCombination * radioCombination,size_t num_radio_configurations,legacy_hal::wifi_radio_configuration * radio_configuration)389 void verifyRadioCombination(WifiRadioCombination* radioCombination, size_t num_radio_configurations,
390 legacy_hal::wifi_radio_configuration* radio_configuration) {
391 EXPECT_EQ(num_radio_configurations, radioCombination->radioConfigurations.size());
392 for (size_t i = 0; i < num_radio_configurations; i++) {
393 EXPECT_EQ(hidl_struct_util::convertLegacyMacBandToHidlWifiBand(radio_configuration->band),
394 radioCombination->radioConfigurations[i].bandInfo);
395 EXPECT_EQ(hidl_struct_util::convertLegacyAntennaConfigurationToHidl(
396 radio_configuration->antenna_cfg),
397 radioCombination->radioConfigurations[i].antennaMode);
398 radio_configuration++;
399 }
400 }
401
TEST_F(HidlStructUtilTest,canConvertLegacyRadioCombinationsMatrixToHidl)402 TEST_F(HidlStructUtilTest, canConvertLegacyRadioCombinationsMatrixToHidl) {
403 legacy_hal::wifi_radio_configuration radio_configurations_array1[] = {
404 {.band = legacy_hal::WLAN_MAC_2_4_BAND, .antenna_cfg = legacy_hal::WIFI_ANTENNA_1X1},
405 };
406 legacy_hal::wifi_radio_configuration radio_configurations_array2[] = {
407 {.band = legacy_hal::WLAN_MAC_2_4_BAND, .antenna_cfg = legacy_hal::WIFI_ANTENNA_2X2},
408 {.band = legacy_hal::WLAN_MAC_5_0_BAND, .antenna_cfg = legacy_hal::WIFI_ANTENNA_3X3},
409 };
410 legacy_hal::wifi_radio_configuration radio_configurations_array3[] = {
411 {.band = legacy_hal::WLAN_MAC_2_4_BAND, .antenna_cfg = legacy_hal::WIFI_ANTENNA_2X2},
412 {.band = legacy_hal::WLAN_MAC_6_0_BAND, .antenna_cfg = legacy_hal::WIFI_ANTENNA_1X1},
413 {.band = legacy_hal::WLAN_MAC_5_0_BAND, .antenna_cfg = legacy_hal::WIFI_ANTENNA_4X4},
414 };
415
416 int num_radio_configs = 0;
417 int num_combinations = 0;
418 std::array<char, 256> buffer;
419 buffer.fill(0);
420 legacy_hal::wifi_radio_combination_matrix* legacy_matrix =
421 reinterpret_cast<wifi_radio_combination_matrix*>(buffer.data());
422 legacy_hal::wifi_radio_combination* radio_combinations;
423
424 // Prepare a legacy wifi_radio_combination_matrix
425 legacy_matrix->num_radio_combinations = 3;
426 // Insert first combination
427 radio_combinations =
428 (legacy_hal::wifi_radio_combination*)((char*)legacy_matrix->radio_combinations);
429 insertRadioCombination(
430 radio_combinations,
431 sizeof(radio_configurations_array1) / sizeof(radio_configurations_array1[0]),
432 radio_configurations_array1);
433 num_combinations++;
434 num_radio_configs +=
435 sizeof(radio_configurations_array1) / sizeof(radio_configurations_array1[0]);
436
437 // Insert second combination
438 radio_combinations =
439 (legacy_hal::wifi_radio_combination*)((char*)legacy_matrix->radio_combinations +
440 (num_combinations *
441 sizeof(legacy_hal::wifi_radio_combination)) +
442 (num_radio_configs *
443 sizeof(wifi_radio_configuration)));
444 insertRadioCombination(
445 radio_combinations,
446 sizeof(radio_configurations_array2) / sizeof(radio_configurations_array2[0]),
447 radio_configurations_array2);
448 num_combinations++;
449 num_radio_configs +=
450 sizeof(radio_configurations_array2) / sizeof(radio_configurations_array2[0]);
451
452 // Insert third combination
453 radio_combinations =
454 (legacy_hal::wifi_radio_combination*)((char*)legacy_matrix->radio_combinations +
455 (num_combinations *
456 sizeof(legacy_hal::wifi_radio_combination)) +
457 (num_radio_configs *
458 sizeof(wifi_radio_configuration)));
459 insertRadioCombination(
460 radio_combinations,
461 sizeof(radio_configurations_array3) / sizeof(radio_configurations_array3[0]),
462 radio_configurations_array3);
463
464 V1_6::WifiRadioCombinationMatrix converted_matrix{};
465 hidl_struct_util::convertLegacyRadioCombinationsMatrixToHidl(legacy_matrix, &converted_matrix);
466
467 // Verify the conversion
468 EXPECT_EQ(legacy_matrix->num_radio_combinations, converted_matrix.radioCombinations.size());
469 verifyRadioCombination(
470 &converted_matrix.radioCombinations[0],
471 sizeof(radio_configurations_array1) / sizeof(radio_configurations_array1[0]),
472 radio_configurations_array1);
473 verifyRadioCombination(
474 &converted_matrix.radioCombinations[1],
475 sizeof(radio_configurations_array2) / sizeof(radio_configurations_array2[0]),
476 radio_configurations_array2);
477 verifyRadioCombination(
478 &converted_matrix.radioCombinations[2],
479 sizeof(radio_configurations_array3) / sizeof(radio_configurations_array3[0]),
480 radio_configurations_array3);
481 }
482 } // namespace implementation
483 } // namespace V1_6
484 } // namespace wifi
485 } // namespace hardware
486 } // namespace android
487