• 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_4 {
38 namespace implementation {
39 using namespace android::hardware::wifi::V1_0;
40 using ::android::hardware::wifi::V1_0::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 =
49             legacy_hal::WLAN_MAC_5_0_BAND | legacy_hal::WLAN_MAC_2_4_BAND};
50     legacy_hal::WifiIfaceInfo legacy_iface_info1 = {.name = kIfaceName1,
51                                                     .channel = kIfaceChannel1};
52     legacy_hal::WifiIfaceInfo legacy_iface_info2 = {.name = kIfaceName2,
53                                                     .channel = kIfaceChannel2};
54     legacy_mac_info1.iface_infos.push_back(legacy_iface_info1);
55     legacy_mac_info1.iface_infos.push_back(legacy_iface_info2);
56     legacy_mac_infos.push_back(legacy_mac_info1);
57 
58     std::vector<IWifiChipEventCallback::RadioModeInfo> hidl_radio_mode_infos;
59     ASSERT_TRUE(hidl_struct_util::convertLegacyWifiMacInfosToHidl(
60         legacy_mac_infos, &hidl_radio_mode_infos));
61 
62     ASSERT_EQ(1u, hidl_radio_mode_infos.size());
63     auto hidl_radio_mode_info1 = hidl_radio_mode_infos[0];
64     EXPECT_EQ(legacy_mac_info1.wlan_mac_id, hidl_radio_mode_info1.radioId);
65     EXPECT_EQ(WifiBand::BAND_24GHZ_5GHZ, hidl_radio_mode_info1.bandInfo);
66     ASSERT_EQ(2u, hidl_radio_mode_info1.ifaceInfos.size());
67     auto hidl_iface_info1 = hidl_radio_mode_info1.ifaceInfos[0];
68     EXPECT_EQ(legacy_iface_info1.name, hidl_iface_info1.name);
69     EXPECT_EQ(static_cast<uint32_t>(legacy_iface_info1.channel),
70               hidl_iface_info1.channel);
71     auto hidl_iface_info2 = hidl_radio_mode_info1.ifaceInfos[1];
72     EXPECT_EQ(legacy_iface_info2.name, hidl_iface_info2.name);
73     EXPECT_EQ(static_cast<uint32_t>(legacy_iface_info2.channel),
74               hidl_iface_info2.channel);
75 }
76 
TEST_F(HidlStructUtilTest,CanConvertLegacyWifiMacInfosToHidlWithTwoMac)77 TEST_F(HidlStructUtilTest, CanConvertLegacyWifiMacInfosToHidlWithTwoMac) {
78     std::vector<legacy_hal::WifiMacInfo> legacy_mac_infos;
79     legacy_hal::WifiMacInfo legacy_mac_info1 = {
80         .wlan_mac_id = kMacId1, .mac_band = legacy_hal::WLAN_MAC_5_0_BAND};
81     legacy_hal::WifiIfaceInfo legacy_iface_info1 = {.name = kIfaceName1,
82                                                     .channel = kIfaceChannel1};
83     legacy_hal::WifiMacInfo legacy_mac_info2 = {
84         .wlan_mac_id = kMacId2, .mac_band = legacy_hal::WLAN_MAC_2_4_BAND};
85     legacy_hal::WifiIfaceInfo legacy_iface_info2 = {.name = kIfaceName2,
86                                                     .channel = kIfaceChannel2};
87     legacy_mac_info1.iface_infos.push_back(legacy_iface_info1);
88     legacy_mac_infos.push_back(legacy_mac_info1);
89     legacy_mac_info2.iface_infos.push_back(legacy_iface_info2);
90     legacy_mac_infos.push_back(legacy_mac_info2);
91 
92     std::vector<IWifiChipEventCallback::RadioModeInfo> hidl_radio_mode_infos;
93     ASSERT_TRUE(hidl_struct_util::convertLegacyWifiMacInfosToHidl(
94         legacy_mac_infos, &hidl_radio_mode_infos));
95 
96     ASSERT_EQ(2u, hidl_radio_mode_infos.size());
97 
98     // Find mac info 1.
99     const auto hidl_radio_mode_info1 = std::find_if(
100         hidl_radio_mode_infos.begin(), hidl_radio_mode_infos.end(),
101         [&legacy_mac_info1](const IWifiChipEventCallback::RadioModeInfo& x) {
102             return x.radioId == legacy_mac_info1.wlan_mac_id;
103         });
104     ASSERT_NE(hidl_radio_mode_infos.end(), hidl_radio_mode_info1);
105     EXPECT_EQ(WifiBand::BAND_5GHZ, hidl_radio_mode_info1->bandInfo);
106     ASSERT_EQ(1u, hidl_radio_mode_info1->ifaceInfos.size());
107     auto hidl_iface_info1 = hidl_radio_mode_info1->ifaceInfos[0];
108     EXPECT_EQ(legacy_iface_info1.name, hidl_iface_info1.name);
109     EXPECT_EQ(static_cast<uint32_t>(legacy_iface_info1.channel),
110               hidl_iface_info1.channel);
111 
112     // Find mac info 2.
113     const auto hidl_radio_mode_info2 = std::find_if(
114         hidl_radio_mode_infos.begin(), hidl_radio_mode_infos.end(),
115         [&legacy_mac_info2](const IWifiChipEventCallback::RadioModeInfo& x) {
116             return x.radioId == legacy_mac_info2.wlan_mac_id;
117         });
118     ASSERT_NE(hidl_radio_mode_infos.end(), hidl_radio_mode_info2);
119     EXPECT_EQ(WifiBand::BAND_24GHZ, hidl_radio_mode_info2->bandInfo);
120     ASSERT_EQ(1u, hidl_radio_mode_info2->ifaceInfos.size());
121     auto hidl_iface_info2 = hidl_radio_mode_info2->ifaceInfos[0];
122     EXPECT_EQ(legacy_iface_info2.name, hidl_iface_info2.name);
123     EXPECT_EQ(static_cast<uint32_t>(legacy_iface_info2.channel),
124               hidl_iface_info2.channel);
125 }
126 
TEST_F(HidlStructUtilTest,canConvertLegacyLinkLayerStatsToHidl)127 TEST_F(HidlStructUtilTest, canConvertLegacyLinkLayerStatsToHidl) {
128     legacy_hal::LinkLayerStats legacy_stats{};
129     legacy_stats.radios.push_back(legacy_hal::LinkLayerRadioStats{});
130     legacy_stats.radios.push_back(legacy_hal::LinkLayerRadioStats{});
131     legacy_stats.iface.beacon_rx = rand();
132     legacy_stats.iface.rssi_mgmt = rand();
133     legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].rx_mpdu = rand();
134     legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].tx_mpdu = rand();
135     legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].mpdu_lost = rand();
136     legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].retries = rand();
137 
138     legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].rx_mpdu = rand();
139     legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].tx_mpdu = rand();
140     legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].mpdu_lost = rand();
141     legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].retries = rand();
142 
143     legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].rx_mpdu = rand();
144     legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].tx_mpdu = rand();
145     legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].mpdu_lost = rand();
146     legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].retries = rand();
147 
148     legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].rx_mpdu = rand();
149     legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].tx_mpdu = rand();
150     legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].mpdu_lost = rand();
151     legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].retries = rand();
152 
153     for (auto& radio : legacy_stats.radios) {
154         radio.stats.on_time = rand();
155         radio.stats.tx_time = rand();
156         radio.stats.rx_time = rand();
157         radio.stats.on_time_scan = rand();
158         radio.stats.on_time_nbd = rand();
159         radio.stats.on_time_gscan = rand();
160         radio.stats.on_time_roam_scan = rand();
161         radio.stats.on_time_pno_scan = rand();
162         radio.stats.on_time_hs20 = rand();
163         for (int i = 0; i < 4; i++) {
164             radio.tx_time_per_levels.push_back(rand());
165         }
166 
167         legacy_hal::wifi_channel_stat channel_stat1 = {
168             .channel = {legacy_hal::WIFI_CHAN_WIDTH_20, 2437, 2437, 0},
169             .on_time = 0x1111,
170             .cca_busy_time = 0x55,
171         };
172         legacy_hal::wifi_channel_stat channel_stat2 = {
173             .channel = {legacy_hal::WIFI_CHAN_WIDTH_20, 5180, 5180, 0},
174             .on_time = 0x2222,
175             .cca_busy_time = 0x66,
176         };
177         radio.channel_stats.push_back(channel_stat1);
178         radio.channel_stats.push_back(channel_stat2);
179     }
180 
181     V1_3::StaLinkLayerStats converted{};
182     hidl_struct_util::convertLegacyLinkLayerStatsToHidl(legacy_stats,
183                                                         &converted);
184     EXPECT_EQ(legacy_stats.iface.beacon_rx, converted.iface.beaconRx);
185     EXPECT_EQ(legacy_stats.iface.rssi_mgmt, converted.iface.avgRssiMgmt);
186     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].rx_mpdu,
187               converted.iface.wmeBePktStats.rxMpdu);
188     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].tx_mpdu,
189               converted.iface.wmeBePktStats.txMpdu);
190     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].mpdu_lost,
191               converted.iface.wmeBePktStats.lostMpdu);
192     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].retries,
193               converted.iface.wmeBePktStats.retries);
194 
195     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].rx_mpdu,
196               converted.iface.wmeBkPktStats.rxMpdu);
197     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].tx_mpdu,
198               converted.iface.wmeBkPktStats.txMpdu);
199     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].mpdu_lost,
200               converted.iface.wmeBkPktStats.lostMpdu);
201     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].retries,
202               converted.iface.wmeBkPktStats.retries);
203 
204     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].rx_mpdu,
205               converted.iface.wmeViPktStats.rxMpdu);
206     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].tx_mpdu,
207               converted.iface.wmeViPktStats.txMpdu);
208     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].mpdu_lost,
209               converted.iface.wmeViPktStats.lostMpdu);
210     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].retries,
211               converted.iface.wmeViPktStats.retries);
212 
213     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].rx_mpdu,
214               converted.iface.wmeVoPktStats.rxMpdu);
215     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].tx_mpdu,
216               converted.iface.wmeVoPktStats.txMpdu);
217     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].mpdu_lost,
218               converted.iface.wmeVoPktStats.lostMpdu);
219     EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].retries,
220               converted.iface.wmeVoPktStats.retries);
221 
222     EXPECT_EQ(legacy_stats.radios.size(), converted.radios.size());
223     for (size_t i = 0; i < legacy_stats.radios.size(); i++) {
224         EXPECT_EQ(legacy_stats.radios[i].stats.on_time,
225                   converted.radios[i].V1_0.onTimeInMs);
226         EXPECT_EQ(legacy_stats.radios[i].stats.tx_time,
227                   converted.radios[i].V1_0.txTimeInMs);
228         EXPECT_EQ(legacy_stats.radios[i].stats.rx_time,
229                   converted.radios[i].V1_0.rxTimeInMs);
230         EXPECT_EQ(legacy_stats.radios[i].stats.on_time_scan,
231                   converted.radios[i].V1_0.onTimeInMsForScan);
232         EXPECT_EQ(legacy_stats.radios[i].tx_time_per_levels.size(),
233                   converted.radios[i].V1_0.txTimeInMsPerLevel.size());
234         for (size_t j = 0; j < legacy_stats.radios[i].tx_time_per_levels.size();
235              j++) {
236             EXPECT_EQ(legacy_stats.radios[i].tx_time_per_levels[j],
237                       converted.radios[i].V1_0.txTimeInMsPerLevel[j]);
238         }
239         EXPECT_EQ(legacy_stats.radios[i].stats.on_time_nbd,
240                   converted.radios[i].onTimeInMsForNanScan);
241         EXPECT_EQ(legacy_stats.radios[i].stats.on_time_gscan,
242                   converted.radios[i].onTimeInMsForBgScan);
243         EXPECT_EQ(legacy_stats.radios[i].stats.on_time_roam_scan,
244                   converted.radios[i].onTimeInMsForRoamScan);
245         EXPECT_EQ(legacy_stats.radios[i].stats.on_time_pno_scan,
246                   converted.radios[i].onTimeInMsForPnoScan);
247         EXPECT_EQ(legacy_stats.radios[i].stats.on_time_hs20,
248                   converted.radios[i].onTimeInMsForHs20Scan);
249         EXPECT_EQ(legacy_stats.radios[i].channel_stats.size(),
250                   converted.radios[i].channelStats.size());
251         for (size_t k = 0; k < legacy_stats.radios[i].channel_stats.size();
252              k++) {
253             auto& legacy_channel_st = legacy_stats.radios[i].channel_stats[k];
254             EXPECT_EQ(WifiChannelWidthInMhz::WIDTH_20,
255                       converted.radios[i].channelStats[k].channel.width);
256             EXPECT_EQ(WifiChannelInMhz(legacy_channel_st.channel.center_freq),
257                       converted.radios[i].channelStats[k].channel.centerFreq);
258             EXPECT_EQ(WifiChannelInMhz(legacy_channel_st.channel.center_freq0),
259                       converted.radios[i].channelStats[k].channel.centerFreq0);
260             EXPECT_EQ(WifiChannelInMhz(legacy_channel_st.channel.center_freq1),
261                       converted.radios[i].channelStats[k].channel.centerFreq1);
262             EXPECT_EQ(legacy_channel_st.cca_busy_time,
263                       converted.radios[i].channelStats[k].ccaBusyTimeInMs);
264             EXPECT_EQ(legacy_channel_st.on_time,
265                       converted.radios[i].channelStats[k].onTimeInMs);
266         }
267     }
268 }
269 
TEST_F(HidlStructUtilTest,CanConvertLegacyFeaturesToHidl)270 TEST_F(HidlStructUtilTest, CanConvertLegacyFeaturesToHidl) {
271     using HidlChipCaps = V1_3::IWifiChip::ChipCapabilityMask;
272 
273     uint32_t hidle_caps;
274 
275     uint32_t legacy_feature_set =
276         WIFI_FEATURE_D2D_RTT | WIFI_FEATURE_SET_LATENCY_MODE;
277     uint32_t legacy_logger_feature_set =
278         legacy_hal::WIFI_LOGGER_DRIVER_DUMP_SUPPORTED;
279 
280     ASSERT_TRUE(hidl_struct_util::convertLegacyFeaturesToHidlChipCapabilities(
281         legacy_feature_set, legacy_logger_feature_set, &hidle_caps));
282 
283     EXPECT_EQ(HidlChipCaps::DEBUG_RING_BUFFER_VENDOR_DATA |
284                   HidlChipCaps::DEBUG_HOST_WAKE_REASON_STATS |
285                   HidlChipCaps::DEBUG_ERROR_ALERTS | HidlChipCaps::D2D_RTT |
286                   HidlChipCaps::SET_LATENCY_MODE |
287                   HidlChipCaps::DEBUG_MEMORY_DRIVER_DUMP,
288               hidle_caps);
289 }
290 }  // namespace implementation
291 }  // namespace V1_4
292 }  // namespace wifi
293 }  // namespace hardware
294 }  // namespace android
295