• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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