blob: 2a030eee1ac0b7ab3c011a2cf103f9509f9b3580 [file] [log] [blame]
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <android-base/logging.h>
#include <android-base/macros.h>
#include <gmock/gmock.h>
#include "aidl_struct_util.h"
using testing::Test;
namespace {
constexpr uint32_t kMacId1 = 1;
constexpr uint32_t kMacId2 = 2;
constexpr uint32_t kIfaceChannel1 = 3;
constexpr uint32_t kIfaceChannel2 = 5;
constexpr char kIfaceName1[] = "wlan0";
constexpr char kIfaceName2[] = "wlan1";
constexpr uint8_t kMacAddress[] = {0x02, 0x12, 0x45, 0x56, 0xab, 0xcc};
byte LCI[] = {0x27, 0x1A, 0x1, 0x00, 0x8, 0x01, 0x00, 0x08, 0x00, 0x10, 0x52,
0x83, 0x4d, 0x12, 0xef, 0xd2, 0xb0, 0x8b, 0x9b, 0x4b, 0xf1, 0xcc,
0x2c, 0x00, 0x00, 0x41, 0x06, 0x03, 0x06, 0x00, 0x80};
byte LCR[] = {0x27, 0xE, 0x1, 0x00, 0xB, 0x01, 0x00, 0x0b, 0x00, 0x09,
0x55, 0x53, 0x18, 0x05, 0x39, 0x34, 0x30, 0x34, 0x33};
constexpr int kNumScanResult = 2;
constexpr int kRssi[] = {-60, -70};
constexpr uint8_t kBssid[] = {0x12, 0x34, 0x56, 0x78, 0x9a, 0};
constexpr uint8_t kSsidLen = 6;
constexpr char kSsid[] = {'a', 'b', 'c', 'd', 'e', '\0'};
} // namespace
namespace aidl {
namespace android {
namespace hardware {
namespace wifi {
class AidlStructUtilTest : public Test {};
TEST_F(AidlStructUtilTest, CanConvertLegacyWifiMacInfosToAidlWithOneMac) {
std::vector<legacy_hal::WifiMacInfo> legacy_mac_infos;
legacy_hal::WifiMacInfo legacy_mac_info1 = {
.wlan_mac_id = kMacId1,
.mac_band = legacy_hal::WLAN_MAC_5_0_BAND | legacy_hal::WLAN_MAC_2_4_BAND};
legacy_hal::WifiIfaceInfo legacy_iface_info1 = {.name = kIfaceName1, .channel = kIfaceChannel1};
legacy_hal::WifiIfaceInfo legacy_iface_info2 = {.name = kIfaceName2, .channel = kIfaceChannel2};
legacy_mac_info1.iface_infos.push_back(legacy_iface_info1);
legacy_mac_info1.iface_infos.push_back(legacy_iface_info2);
legacy_mac_infos.push_back(legacy_mac_info1);
std::vector<IWifiChipEventCallback::RadioModeInfo> aidl_radio_mode_infos;
ASSERT_TRUE(aidl_struct_util::convertLegacyWifiMacInfosToAidl(legacy_mac_infos,
&aidl_radio_mode_infos));
ASSERT_EQ(1u, aidl_radio_mode_infos.size());
auto aidl_radio_mode_info1 = aidl_radio_mode_infos[0];
EXPECT_EQ(legacy_mac_info1.wlan_mac_id, (uint32_t)aidl_radio_mode_info1.radioId);
EXPECT_EQ(WifiBand::BAND_24GHZ_5GHZ, aidl_radio_mode_info1.bandInfo);
ASSERT_EQ(2u, aidl_radio_mode_info1.ifaceInfos.size());
auto aidl_iface_info1 = aidl_radio_mode_info1.ifaceInfos[0];
EXPECT_EQ(legacy_iface_info1.name, aidl_iface_info1.name);
EXPECT_EQ(static_cast<int32_t>(legacy_iface_info1.channel), aidl_iface_info1.channel);
auto aidl_iface_info2 = aidl_radio_mode_info1.ifaceInfos[1];
EXPECT_EQ(legacy_iface_info2.name, aidl_iface_info2.name);
EXPECT_EQ(static_cast<int32_t>(legacy_iface_info2.channel), aidl_iface_info2.channel);
}
TEST_F(AidlStructUtilTest, CanConvertLegacyWifiMacInfosToAidlWithTwoMac) {
std::vector<legacy_hal::WifiMacInfo> legacy_mac_infos;
legacy_hal::WifiMacInfo legacy_mac_info1 = {.wlan_mac_id = kMacId1,
.mac_band = legacy_hal::WLAN_MAC_5_0_BAND};
legacy_hal::WifiIfaceInfo legacy_iface_info1 = {.name = kIfaceName1, .channel = kIfaceChannel1};
legacy_hal::WifiMacInfo legacy_mac_info2 = {.wlan_mac_id = kMacId2,
.mac_band = legacy_hal::WLAN_MAC_2_4_BAND};
legacy_hal::WifiIfaceInfo legacy_iface_info2 = {.name = kIfaceName2, .channel = kIfaceChannel2};
legacy_mac_info1.iface_infos.push_back(legacy_iface_info1);
legacy_mac_infos.push_back(legacy_mac_info1);
legacy_mac_info2.iface_infos.push_back(legacy_iface_info2);
legacy_mac_infos.push_back(legacy_mac_info2);
std::vector<IWifiChipEventCallback::RadioModeInfo> aidl_radio_mode_infos;
ASSERT_TRUE(aidl_struct_util::convertLegacyWifiMacInfosToAidl(legacy_mac_infos,
&aidl_radio_mode_infos));
ASSERT_EQ(2u, aidl_radio_mode_infos.size());
// Find mac info 1.
const auto aidl_radio_mode_info1 =
std::find_if(aidl_radio_mode_infos.begin(), aidl_radio_mode_infos.end(),
[&legacy_mac_info1](const IWifiChipEventCallback::RadioModeInfo& x) {
return (uint32_t)x.radioId == legacy_mac_info1.wlan_mac_id;
});
ASSERT_NE(aidl_radio_mode_infos.end(), aidl_radio_mode_info1);
EXPECT_EQ(WifiBand::BAND_5GHZ, aidl_radio_mode_info1->bandInfo);
ASSERT_EQ(1u, aidl_radio_mode_info1->ifaceInfos.size());
auto aidl_iface_info1 = aidl_radio_mode_info1->ifaceInfos[0];
EXPECT_EQ(legacy_iface_info1.name, aidl_iface_info1.name);
EXPECT_EQ(static_cast<int32_t>(legacy_iface_info1.channel), aidl_iface_info1.channel);
// Find mac info 2.
const auto aidl_radio_mode_info2 =
std::find_if(aidl_radio_mode_infos.begin(), aidl_radio_mode_infos.end(),
[&legacy_mac_info2](const IWifiChipEventCallback::RadioModeInfo& x) {
return (uint32_t)x.radioId == legacy_mac_info2.wlan_mac_id;
});
ASSERT_NE(aidl_radio_mode_infos.end(), aidl_radio_mode_info2);
EXPECT_EQ(WifiBand::BAND_24GHZ, aidl_radio_mode_info2->bandInfo);
ASSERT_EQ(1u, aidl_radio_mode_info2->ifaceInfos.size());
auto aidl_iface_info2 = aidl_radio_mode_info2->ifaceInfos[0];
EXPECT_EQ(legacy_iface_info2.name, aidl_iface_info2.name);
EXPECT_EQ(static_cast<int32_t>(legacy_iface_info2.channel), aidl_iface_info2.channel);
}
TEST_F(AidlStructUtilTest, canConvertLegacyLinkLayerMlStatsToAidl) {
legacy_hal::LinkLayerMlStats legacy_ml_stats{};
// Add two radio stats
legacy_ml_stats.radios.push_back(legacy_hal::LinkLayerRadioStats{});
legacy_ml_stats.radios.push_back(legacy_hal::LinkLayerRadioStats{});
wifi_link_state states[sizeof(wifi_link_state)] = {wifi_link_state::WIFI_LINK_STATE_UNKNOWN,
wifi_link_state::WIFI_LINK_STATE_NOT_IN_USE,
wifi_link_state::WIFI_LINK_STATE_IN_USE};
// Add two links.
legacy_ml_stats.links.push_back(legacy_hal::LinkStats{});
legacy_ml_stats.links.push_back(legacy_hal::LinkStats{});
// Set stats for each link.
for (legacy_hal::LinkStats& link : legacy_ml_stats.links) {
link.peers.push_back(legacy_hal::WifiPeerInfo{});
link.peers.push_back(legacy_hal::WifiPeerInfo{});
link.stat.beacon_rx = rand();
// MLO link id: 0 - 15
link.stat.link_id = rand() % 16;
link.stat.state = states[rand() % sizeof(states)];
// Maximum number of radios is limited to 3 for testing.
link.stat.radio = rand() % 4;
link.stat.frequency = rand();
// RSSI: 0 to -127
link.stat.rssi_mgmt = (rand() % 128) * -1;
link.stat.ac[legacy_hal::WIFI_AC_BE].rx_mpdu = rand();
link.stat.ac[legacy_hal::WIFI_AC_BE].tx_mpdu = rand();
link.stat.ac[legacy_hal::WIFI_AC_BE].mpdu_lost = rand();
link.stat.ac[legacy_hal::WIFI_AC_BE].retries = rand();
link.stat.ac[legacy_hal::WIFI_AC_BE].contention_time_min = rand();
link.stat.ac[legacy_hal::WIFI_AC_BE].contention_time_max = rand();
link.stat.ac[legacy_hal::WIFI_AC_BE].contention_time_avg = rand();
link.stat.ac[legacy_hal::WIFI_AC_BE].contention_num_samples = rand();
link.stat.ac[legacy_hal::WIFI_AC_BK].rx_mpdu = rand();
link.stat.ac[legacy_hal::WIFI_AC_BK].tx_mpdu = rand();
link.stat.ac[legacy_hal::WIFI_AC_BK].mpdu_lost = rand();
link.stat.ac[legacy_hal::WIFI_AC_BK].retries = rand();
link.stat.ac[legacy_hal::WIFI_AC_BK].contention_time_min = rand();
link.stat.ac[legacy_hal::WIFI_AC_BK].contention_time_max = rand();
link.stat.ac[legacy_hal::WIFI_AC_BK].contention_time_avg = rand();
link.stat.ac[legacy_hal::WIFI_AC_BK].contention_num_samples = rand();
link.stat.ac[legacy_hal::WIFI_AC_VI].rx_mpdu = rand();
link.stat.ac[legacy_hal::WIFI_AC_VI].tx_mpdu = rand();
link.stat.ac[legacy_hal::WIFI_AC_VI].mpdu_lost = rand();
link.stat.ac[legacy_hal::WIFI_AC_VI].retries = rand();
link.stat.ac[legacy_hal::WIFI_AC_VI].contention_time_min = rand();
link.stat.ac[legacy_hal::WIFI_AC_VI].contention_time_max = rand();
link.stat.ac[legacy_hal::WIFI_AC_VI].contention_time_avg = rand();
link.stat.ac[legacy_hal::WIFI_AC_VI].contention_num_samples = rand();
link.stat.ac[legacy_hal::WIFI_AC_VO].rx_mpdu = rand();
link.stat.ac[legacy_hal::WIFI_AC_VO].tx_mpdu = rand();
link.stat.ac[legacy_hal::WIFI_AC_VO].mpdu_lost = rand();
link.stat.ac[legacy_hal::WIFI_AC_VO].retries = rand();
link.stat.ac[legacy_hal::WIFI_AC_VO].contention_time_min = rand();
link.stat.ac[legacy_hal::WIFI_AC_VO].contention_time_max = rand();
link.stat.ac[legacy_hal::WIFI_AC_VO].contention_time_avg = rand();
link.stat.ac[legacy_hal::WIFI_AC_VO].contention_num_samples = rand();
link.stat.time_slicing_duty_cycle_percent = rand() % 101;
link.stat.num_peers = 2;
// Set peer stats for each of the peers.
for (auto& peer : link.peers) {
// Max station count is limited to 32 for testing.
peer.peer_info.bssload.sta_count = rand() % 33;
peer.peer_info.bssload.chan_util = rand() % 101;
wifi_rate_stat rate_stat1 = {
.rate = {3, 1, 2, 5, 0, 0},
.tx_mpdu = 0,
.rx_mpdu = 1,
.mpdu_lost = 2,
.retries = 3,
.retries_short = 4,
.retries_long = 5,
};
wifi_rate_stat rate_stat2 = {
.rate = {2, 2, 1, 6, 0, 1},
.tx_mpdu = 6,
.rx_mpdu = 7,
.mpdu_lost = 8,
.retries = 9,
.retries_short = 10,
.retries_long = 11,
};
peer.rate_stats.push_back(rate_stat1);
peer.rate_stats.push_back(rate_stat2);
}
}
// Set radio stats
for (auto& radio : legacy_ml_stats.radios) {
// Maximum number of radios is limited to 3 for testing.
radio.stats.radio = rand() % 4;
radio.stats.on_time = rand();
radio.stats.tx_time = rand();
radio.stats.rx_time = rand();
radio.stats.on_time_scan = rand();
radio.stats.on_time_nbd = rand();
radio.stats.on_time_gscan = rand();
radio.stats.on_time_roam_scan = rand();
radio.stats.on_time_pno_scan = rand();
radio.stats.on_time_hs20 = rand();
for (int i = 0; i < 4; i++) {
radio.tx_time_per_levels.push_back(rand());
}
legacy_hal::wifi_channel_stat channel_stat1 = {
.channel = {legacy_hal::WIFI_CHAN_WIDTH_20, 2437, 2437, 0},
.on_time = 0x1111,
.cca_busy_time = 0x55,
};
legacy_hal::wifi_channel_stat channel_stat2 = {
.channel = {legacy_hal::WIFI_CHAN_WIDTH_20, 5180, 5180, 0},
.on_time = 0x2222,
.cca_busy_time = 0x66,
};
radio.channel_stats.push_back(channel_stat1);
radio.channel_stats.push_back(channel_stat2);
}
// Convert to AIDL
StaLinkLayerStats converted{};
aidl_struct_util::convertLegacyLinkLayerMlStatsToAidl(legacy_ml_stats, &converted);
// Validate
int l = 0;
for (legacy_hal::LinkStats& link : legacy_ml_stats.links) {
EXPECT_EQ(link.stat.link_id, (uint8_t)converted.iface.links[l].linkId);
StaLinkLayerLinkStats::StaLinkState expectedState;
switch (link.stat.state) {
case wifi_link_state::WIFI_LINK_STATE_NOT_IN_USE:
expectedState = StaLinkLayerLinkStats::StaLinkState::NOT_IN_USE;
break;
case wifi_link_state::WIFI_LINK_STATE_IN_USE:
expectedState = StaLinkLayerLinkStats::StaLinkState::IN_USE;
break;
default:
expectedState = StaLinkLayerLinkStats::StaLinkState::UNKNOWN;
}
EXPECT_EQ(expectedState, converted.iface.links[l].state);
EXPECT_EQ(link.stat.radio, converted.iface.links[l].radioId);
EXPECT_EQ(link.stat.frequency, (uint32_t)converted.iface.links[l].frequencyMhz);
EXPECT_EQ(link.stat.beacon_rx, (uint32_t)converted.iface.links[l].beaconRx);
EXPECT_EQ(link.stat.rssi_mgmt, converted.iface.links[l].avgRssiMgmt);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_BE].rx_mpdu,
converted.iface.links[l].wmeBePktStats.rxMpdu);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_BE].tx_mpdu,
converted.iface.links[l].wmeBePktStats.txMpdu);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_BE].mpdu_lost,
converted.iface.links[l].wmeBePktStats.lostMpdu);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_BE].retries,
converted.iface.links[l].wmeBePktStats.retries);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_BE].contention_time_min,
(uint32_t)converted.iface.links[l]
.wmeBeContentionTimeStats.contentionTimeMinInUsec);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_BE].contention_time_max,
(uint32_t)converted.iface.links[l]
.wmeBeContentionTimeStats.contentionTimeMaxInUsec);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_BE].contention_time_avg,
(uint32_t)converted.iface.links[l]
.wmeBeContentionTimeStats.contentionTimeAvgInUsec);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_BE].contention_num_samples,
(uint32_t)converted.iface.links[l].wmeBeContentionTimeStats.contentionNumSamples);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_BK].rx_mpdu,
converted.iface.links[l].wmeBkPktStats.rxMpdu);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_BK].tx_mpdu,
converted.iface.links[l].wmeBkPktStats.txMpdu);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_BK].mpdu_lost,
converted.iface.links[l].wmeBkPktStats.lostMpdu);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_BK].retries,
converted.iface.links[l].wmeBkPktStats.retries);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_BK].contention_time_min,
(uint32_t)converted.iface.links[l]
.wmeBkContentionTimeStats.contentionTimeMinInUsec);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_BK].contention_time_max,
(uint32_t)converted.iface.links[l]
.wmeBkContentionTimeStats.contentionTimeMaxInUsec);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_BK].contention_time_avg,
(uint32_t)converted.iface.links[l]
.wmeBkContentionTimeStats.contentionTimeAvgInUsec);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_BK].contention_num_samples,
(uint32_t)converted.iface.links[l].wmeBkContentionTimeStats.contentionNumSamples);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_VI].rx_mpdu,
converted.iface.links[l].wmeViPktStats.rxMpdu);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_VI].tx_mpdu,
converted.iface.links[l].wmeViPktStats.txMpdu);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_VI].mpdu_lost,
converted.iface.links[l].wmeViPktStats.lostMpdu);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_VI].retries,
converted.iface.links[l].wmeViPktStats.retries);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_VI].contention_time_min,
(uint32_t)converted.iface.links[l]
.wmeViContentionTimeStats.contentionTimeMinInUsec);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_VI].contention_time_max,
(uint32_t)converted.iface.links[l]
.wmeViContentionTimeStats.contentionTimeMaxInUsec);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_VI].contention_time_avg,
(uint32_t)converted.iface.links[l]
.wmeViContentionTimeStats.contentionTimeAvgInUsec);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_VI].contention_num_samples,
(uint32_t)converted.iface.links[l].wmeViContentionTimeStats.contentionNumSamples);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_VO].rx_mpdu,
converted.iface.links[l].wmeVoPktStats.rxMpdu);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_VO].tx_mpdu,
converted.iface.links[l].wmeVoPktStats.txMpdu);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_VO].mpdu_lost,
converted.iface.links[l].wmeVoPktStats.lostMpdu);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_VO].retries,
converted.iface.links[l].wmeVoPktStats.retries);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_VO].contention_time_min,
(uint32_t)converted.iface.links[l]
.wmeVoContentionTimeStats.contentionTimeMinInUsec);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_VO].contention_time_max,
(uint32_t)converted.iface.links[l]
.wmeVoContentionTimeStats.contentionTimeMaxInUsec);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_VO].contention_time_avg,
(uint32_t)converted.iface.links[l]
.wmeVoContentionTimeStats.contentionTimeAvgInUsec);
EXPECT_EQ(link.stat.ac[legacy_hal::WIFI_AC_VO].contention_num_samples,
(uint32_t)converted.iface.links[l].wmeVoContentionTimeStats.contentionNumSamples);
EXPECT_EQ(link.stat.time_slicing_duty_cycle_percent,
converted.iface.links[l].timeSliceDutyCycleInPercent);
EXPECT_EQ(link.peers.size(), converted.iface.links[l].peers.size());
for (size_t i = 0; i < link.peers.size(); i++) {
EXPECT_EQ(link.peers[i].peer_info.bssload.sta_count,
converted.iface.links[l].peers[i].staCount);
EXPECT_EQ(link.peers[i].peer_info.bssload.chan_util,
converted.iface.links[l].peers[i].chanUtil);
for (size_t j = 0; j < link.peers[i].rate_stats.size(); j++) {
EXPECT_EQ(
link.peers[i].rate_stats[j].rate.preamble,
(uint32_t)converted.iface.links[l].peers[i].rateStats[j].rateInfo.preamble);
EXPECT_EQ(link.peers[i].rate_stats[j].rate.nss,
(uint32_t)converted.iface.links[l].peers[i].rateStats[j].rateInfo.nss);
EXPECT_EQ(link.peers[i].rate_stats[j].rate.bw,
(uint32_t)converted.iface.links[l].peers[i].rateStats[j].rateInfo.bw);
EXPECT_EQ(link.peers[i].rate_stats[j].rate.rateMcsIdx,
(uint32_t)converted.iface.links[l]
.peers[i]
.rateStats[j]
.rateInfo.rateMcsIdx);
EXPECT_EQ(link.peers[i].rate_stats[j].tx_mpdu,
(uint32_t)converted.iface.links[l].peers[i].rateStats[j].txMpdu);
EXPECT_EQ(link.peers[i].rate_stats[j].rx_mpdu,
(uint32_t)converted.iface.links[l].peers[i].rateStats[j].rxMpdu);
EXPECT_EQ(link.peers[i].rate_stats[j].mpdu_lost,
(uint32_t)converted.iface.links[l].peers[i].rateStats[j].mpduLost);
EXPECT_EQ(link.peers[i].rate_stats[j].retries,
(uint32_t)converted.iface.links[l].peers[i].rateStats[j].retries);
}
}
++l;
} // loop over links
EXPECT_EQ(legacy_ml_stats.radios.size(), converted.radios.size());
for (size_t i = 0; i < legacy_ml_stats.radios.size(); i++) {
EXPECT_EQ(legacy_ml_stats.radios[i].stats.radio, converted.radios[i].radioId);
EXPECT_EQ(legacy_ml_stats.radios[i].stats.on_time,
(uint32_t)converted.radios[i].onTimeInMs);
EXPECT_EQ(legacy_ml_stats.radios[i].stats.tx_time,
(uint32_t)converted.radios[i].txTimeInMs);
EXPECT_EQ(legacy_ml_stats.radios[i].stats.rx_time,
(uint32_t)converted.radios[i].rxTimeInMs);
EXPECT_EQ(legacy_ml_stats.radios[i].stats.on_time_scan,
(uint32_t)converted.radios[i].onTimeInMsForScan);
EXPECT_EQ(legacy_ml_stats.radios[i].tx_time_per_levels.size(),
converted.radios[i].txTimeInMsPerLevel.size());
for (size_t j = 0; j < legacy_ml_stats.radios[i].tx_time_per_levels.size(); j++) {
EXPECT_EQ(legacy_ml_stats.radios[i].tx_time_per_levels[j],
(uint32_t)converted.radios[i].txTimeInMsPerLevel[j]);
}
EXPECT_EQ(legacy_ml_stats.radios[i].stats.on_time_nbd,
(uint32_t)converted.radios[i].onTimeInMsForNanScan);
EXPECT_EQ(legacy_ml_stats.radios[i].stats.on_time_gscan,
(uint32_t)converted.radios[i].onTimeInMsForBgScan);
EXPECT_EQ(legacy_ml_stats.radios[i].stats.on_time_roam_scan,
(uint32_t)converted.radios[i].onTimeInMsForRoamScan);
EXPECT_EQ(legacy_ml_stats.radios[i].stats.on_time_pno_scan,
(uint32_t)converted.radios[i].onTimeInMsForPnoScan);
EXPECT_EQ(legacy_ml_stats.radios[i].stats.on_time_hs20,
(uint32_t)converted.radios[i].onTimeInMsForHs20Scan);
EXPECT_EQ(legacy_ml_stats.radios[i].channel_stats.size(),
converted.radios[i].channelStats.size());
for (size_t k = 0; k < legacy_ml_stats.radios[i].channel_stats.size(); k++) {
auto& legacy_channel_st = legacy_ml_stats.radios[i].channel_stats[k];
EXPECT_EQ(WifiChannelWidthInMhz::WIDTH_20,
converted.radios[i].channelStats[k].channel.width);
EXPECT_EQ(legacy_channel_st.channel.center_freq,
converted.radios[i].channelStats[k].channel.centerFreq);
EXPECT_EQ(legacy_channel_st.channel.center_freq0,
converted.radios[i].channelStats[k].channel.centerFreq0);
EXPECT_EQ(legacy_channel_st.channel.center_freq1,
converted.radios[i].channelStats[k].channel.centerFreq1);
EXPECT_EQ(legacy_channel_st.cca_busy_time,
(uint32_t)converted.radios[i].channelStats[k].ccaBusyTimeInMs);
EXPECT_EQ(legacy_channel_st.on_time,
(uint32_t)converted.radios[i].channelStats[k].onTimeInMs);
}
}
}
TEST_F(AidlStructUtilTest, canConvertLegacyLinkLayerStatsToAidl) {
legacy_hal::LinkLayerStats legacy_stats{};
legacy_stats.radios.push_back(legacy_hal::LinkLayerRadioStats{});
legacy_stats.radios.push_back(legacy_hal::LinkLayerRadioStats{});
legacy_stats.peers.push_back(legacy_hal::WifiPeerInfo{});
legacy_stats.peers.push_back(legacy_hal::WifiPeerInfo{});
legacy_stats.iface.beacon_rx = rand();
// RSSI: 0 to -127
legacy_stats.iface.rssi_mgmt = rand() % 128;
legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].rx_mpdu = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].tx_mpdu = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].mpdu_lost = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].retries = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].contention_time_min = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].contention_time_max = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].contention_time_avg = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].contention_num_samples = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].rx_mpdu = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].tx_mpdu = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].mpdu_lost = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].retries = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].contention_time_min = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].contention_time_max = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].contention_time_avg = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].contention_num_samples = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].rx_mpdu = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].tx_mpdu = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].mpdu_lost = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].retries = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].contention_time_min = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].contention_time_max = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].contention_time_avg = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].contention_num_samples = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].rx_mpdu = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].tx_mpdu = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].mpdu_lost = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].retries = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].contention_time_min = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].contention_time_max = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].contention_time_avg = rand();
legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].contention_num_samples = rand();
legacy_stats.iface.info.time_slicing_duty_cycle_percent = rand() % 101;
legacy_stats.iface.num_peers = 1;
for (auto& radio : legacy_stats.radios) {
// Max number of radios limit to 3.
radio.stats.radio = rand() % 4;
radio.stats.on_time = rand();
radio.stats.tx_time = rand();
radio.stats.rx_time = rand();
radio.stats.on_time_scan = rand();
radio.stats.on_time_nbd = rand();
radio.stats.on_time_gscan = rand();
radio.stats.on_time_roam_scan = rand();
radio.stats.on_time_pno_scan = rand();
radio.stats.on_time_hs20 = rand();
for (int i = 0; i < 4; i++) {
radio.tx_time_per_levels.push_back(rand());
}
legacy_hal::wifi_channel_stat channel_stat1 = {
.channel = {legacy_hal::WIFI_CHAN_WIDTH_20, 2437, 2437, 0},
.on_time = 0x1111,
.cca_busy_time = 0x55,
};
legacy_hal::wifi_channel_stat channel_stat2 = {
.channel = {legacy_hal::WIFI_CHAN_WIDTH_20, 5180, 5180, 0},
.on_time = 0x2222,
.cca_busy_time = 0x66,
};
radio.channel_stats.push_back(channel_stat1);
radio.channel_stats.push_back(channel_stat2);
}
for (auto& peer : legacy_stats.peers) {
// Max number of stations is limited to 32 for testing.
peer.peer_info.bssload.sta_count = rand() % 33;
peer.peer_info.bssload.chan_util = rand() % 101;
wifi_rate_stat rate_stat1 = {
.rate = {3, 1, 2, 5, 0, 0},
.tx_mpdu = 0,
.rx_mpdu = 1,
.mpdu_lost = 2,
.retries = 3,
.retries_short = 4,
.retries_long = 5,
};
wifi_rate_stat rate_stat2 = {
.rate = {2, 2, 1, 6, 0, 1},
.tx_mpdu = 6,
.rx_mpdu = 7,
.mpdu_lost = 8,
.retries = 9,
.retries_short = 10,
.retries_long = 11,
};
peer.rate_stats.push_back(rate_stat1);
peer.rate_stats.push_back(rate_stat2);
}
StaLinkLayerStats converted{};
aidl_struct_util::convertLegacyLinkLayerStatsToAidl(legacy_stats, &converted);
EXPECT_EQ(0, converted.iface.links[0].linkId);
EXPECT_EQ(legacy_stats.iface.beacon_rx, (uint32_t)converted.iface.links[0].beaconRx);
EXPECT_EQ(legacy_stats.iface.rssi_mgmt, converted.iface.links[0].avgRssiMgmt);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].rx_mpdu,
converted.iface.links[0].wmeBePktStats.rxMpdu);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].tx_mpdu,
converted.iface.links[0].wmeBePktStats.txMpdu);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].mpdu_lost,
converted.iface.links[0].wmeBePktStats.lostMpdu);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].retries,
converted.iface.links[0].wmeBePktStats.retries);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].contention_time_min,
(uint32_t)converted.iface.links[0].wmeBeContentionTimeStats.contentionTimeMinInUsec);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].contention_time_max,
(uint32_t)converted.iface.links[0].wmeBeContentionTimeStats.contentionTimeMaxInUsec);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].contention_time_avg,
(uint32_t)converted.iface.links[0].wmeBeContentionTimeStats.contentionTimeAvgInUsec);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BE].contention_num_samples,
(uint32_t)converted.iface.links[0].wmeBeContentionTimeStats.contentionNumSamples);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].rx_mpdu,
converted.iface.links[0].wmeBkPktStats.rxMpdu);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].tx_mpdu,
converted.iface.links[0].wmeBkPktStats.txMpdu);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].mpdu_lost,
converted.iface.links[0].wmeBkPktStats.lostMpdu);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].retries,
converted.iface.links[0].wmeBkPktStats.retries);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].contention_time_min,
(uint32_t)converted.iface.links[0].wmeBkContentionTimeStats.contentionTimeMinInUsec);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].contention_time_max,
(uint32_t)converted.iface.links[0].wmeBkContentionTimeStats.contentionTimeMaxInUsec);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].contention_time_avg,
(uint32_t)converted.iface.links[0].wmeBkContentionTimeStats.contentionTimeAvgInUsec);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_BK].contention_num_samples,
(uint32_t)converted.iface.links[0].wmeBkContentionTimeStats.contentionNumSamples);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].rx_mpdu,
converted.iface.links[0].wmeViPktStats.rxMpdu);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].tx_mpdu,
converted.iface.links[0].wmeViPktStats.txMpdu);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].mpdu_lost,
converted.iface.links[0].wmeViPktStats.lostMpdu);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].retries,
converted.iface.links[0].wmeViPktStats.retries);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].contention_time_min,
(uint32_t)converted.iface.links[0].wmeViContentionTimeStats.contentionTimeMinInUsec);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].contention_time_max,
(uint32_t)converted.iface.links[0].wmeViContentionTimeStats.contentionTimeMaxInUsec);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].contention_time_avg,
(uint32_t)converted.iface.links[0].wmeViContentionTimeStats.contentionTimeAvgInUsec);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VI].contention_num_samples,
(uint32_t)converted.iface.links[0].wmeViContentionTimeStats.contentionNumSamples);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].rx_mpdu,
converted.iface.links[0].wmeVoPktStats.rxMpdu);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].tx_mpdu,
converted.iface.links[0].wmeVoPktStats.txMpdu);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].mpdu_lost,
converted.iface.links[0].wmeVoPktStats.lostMpdu);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].retries,
converted.iface.links[0].wmeVoPktStats.retries);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].contention_time_min,
(uint32_t)converted.iface.links[0].wmeVoContentionTimeStats.contentionTimeMinInUsec);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].contention_time_max,
(uint32_t)converted.iface.links[0].wmeVoContentionTimeStats.contentionTimeMaxInUsec);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].contention_time_avg,
(uint32_t)converted.iface.links[0].wmeVoContentionTimeStats.contentionTimeAvgInUsec);
EXPECT_EQ(legacy_stats.iface.ac[legacy_hal::WIFI_AC_VO].contention_num_samples,
(uint32_t)converted.iface.links[0].wmeVoContentionTimeStats.contentionNumSamples);
EXPECT_EQ(legacy_stats.iface.info.time_slicing_duty_cycle_percent,
converted.iface.links[0].timeSliceDutyCycleInPercent);
EXPECT_EQ(legacy_stats.radios.size(), converted.radios.size());
for (size_t i = 0; i < legacy_stats.radios.size(); i++) {
EXPECT_EQ(legacy_stats.radios[i].stats.radio, converted.radios[i].radioId);
EXPECT_EQ(legacy_stats.radios[i].stats.on_time, (uint32_t)converted.radios[i].onTimeInMs);
EXPECT_EQ(legacy_stats.radios[i].stats.tx_time, (uint32_t)converted.radios[i].txTimeInMs);
EXPECT_EQ(legacy_stats.radios[i].stats.rx_time, (uint32_t)converted.radios[i].rxTimeInMs);
EXPECT_EQ(legacy_stats.radios[i].stats.on_time_scan,
(uint32_t)converted.radios[i].onTimeInMsForScan);
EXPECT_EQ(legacy_stats.radios[i].tx_time_per_levels.size(),
converted.radios[i].txTimeInMsPerLevel.size());
for (size_t j = 0; j < legacy_stats.radios[i].tx_time_per_levels.size(); j++) {
EXPECT_EQ(legacy_stats.radios[i].tx_time_per_levels[j],
(uint32_t)converted.radios[i].txTimeInMsPerLevel[j]);
}
EXPECT_EQ(legacy_stats.radios[i].stats.on_time_nbd,
(uint32_t)converted.radios[i].onTimeInMsForNanScan);
EXPECT_EQ(legacy_stats.radios[i].stats.on_time_gscan,
(uint32_t)converted.radios[i].onTimeInMsForBgScan);
EXPECT_EQ(legacy_stats.radios[i].stats.on_time_roam_scan,
(uint32_t)converted.radios[i].onTimeInMsForRoamScan);
EXPECT_EQ(legacy_stats.radios[i].stats.on_time_pno_scan,
(uint32_t)converted.radios[i].onTimeInMsForPnoScan);
EXPECT_EQ(legacy_stats.radios[i].stats.on_time_hs20,
(uint32_t)converted.radios[i].onTimeInMsForHs20Scan);
EXPECT_EQ(legacy_stats.radios[i].channel_stats.size(),
converted.radios[i].channelStats.size());
for (size_t k = 0; k < legacy_stats.radios[i].channel_stats.size(); k++) {
auto& legacy_channel_st = legacy_stats.radios[i].channel_stats[k];
EXPECT_EQ(WifiChannelWidthInMhz::WIDTH_20,
converted.radios[i].channelStats[k].channel.width);
EXPECT_EQ(legacy_channel_st.channel.center_freq,
converted.radios[i].channelStats[k].channel.centerFreq);
EXPECT_EQ(legacy_channel_st.channel.center_freq0,
converted.radios[i].channelStats[k].channel.centerFreq0);
EXPECT_EQ(legacy_channel_st.channel.center_freq1,
converted.radios[i].channelStats[k].channel.centerFreq1);
EXPECT_EQ(legacy_channel_st.cca_busy_time,
(uint32_t)converted.radios[i].channelStats[k].ccaBusyTimeInMs);
EXPECT_EQ(legacy_channel_st.on_time,
(uint32_t)converted.radios[i].channelStats[k].onTimeInMs);
}
}
EXPECT_EQ(legacy_stats.peers.size(), converted.iface.links[0].peers.size());
for (size_t i = 0; i < legacy_stats.peers.size(); i++) {
EXPECT_EQ(legacy_stats.peers[i].peer_info.bssload.sta_count,
converted.iface.links[0].peers[i].staCount);
EXPECT_EQ(legacy_stats.peers[i].peer_info.bssload.chan_util,
converted.iface.links[0].peers[i].chanUtil);
for (size_t j = 0; j < legacy_stats.peers[i].rate_stats.size(); j++) {
EXPECT_EQ(legacy_stats.peers[i].rate_stats[j].rate.preamble,
(uint32_t)converted.iface.links[0].peers[i].rateStats[j].rateInfo.preamble);
EXPECT_EQ(legacy_stats.peers[i].rate_stats[j].rate.nss,
(uint32_t)converted.iface.links[0].peers[i].rateStats[j].rateInfo.nss);
EXPECT_EQ(legacy_stats.peers[i].rate_stats[j].rate.bw,
(uint32_t)converted.iface.links[0].peers[i].rateStats[j].rateInfo.bw);
EXPECT_EQ(legacy_stats.peers[i].rate_stats[j].rate.rateMcsIdx,
(uint32_t)converted.iface.links[0].peers[i].rateStats[j].rateInfo.rateMcsIdx);
EXPECT_EQ(legacy_stats.peers[i].rate_stats[j].tx_mpdu,
(uint32_t)converted.iface.links[0].peers[i].rateStats[j].txMpdu);
EXPECT_EQ(legacy_stats.peers[i].rate_stats[j].rx_mpdu,
(uint32_t)converted.iface.links[0].peers[i].rateStats[j].rxMpdu);
EXPECT_EQ(legacy_stats.peers[i].rate_stats[j].mpdu_lost,
(uint32_t)converted.iface.links[0].peers[i].rateStats[j].mpduLost);
EXPECT_EQ(legacy_stats.peers[i].rate_stats[j].retries,
(uint32_t)converted.iface.links[0].peers[i].rateStats[j].retries);
}
}
}
TEST_F(AidlStructUtilTest, CanConvertLegacyFeaturesToAidl) {
using AidlChipCaps = IWifiChip::FeatureSetMask;
uint32_t aidl_features;
uint32_t legacy_feature_set = WIFI_FEATURE_D2D_RTT | WIFI_FEATURE_SET_LATENCY_MODE;
ASSERT_TRUE(
aidl_struct_util::convertLegacyChipFeaturesToAidl(legacy_feature_set, &aidl_features));
EXPECT_EQ((uint32_t)AidlChipCaps::D2D_RTT | (uint32_t)AidlChipCaps::SET_LATENCY_MODE,
aidl_features);
}
void insertRadioCombination(legacy_hal::wifi_radio_combination* dst_radio_combination_ptr,
int num_radio_configurations,
legacy_hal::wifi_radio_configuration* radio_configuration) {
dst_radio_combination_ptr->num_radio_configurations = num_radio_configurations;
memcpy(dst_radio_combination_ptr->radio_configurations, radio_configuration,
num_radio_configurations * sizeof(legacy_hal::wifi_radio_configuration));
}
void verifyRadioCombination(WifiRadioCombination* radioCombination, size_t num_radio_configurations,
legacy_hal::wifi_radio_configuration* radio_configuration) {
EXPECT_EQ(num_radio_configurations, radioCombination->radioConfigurations.size());
for (size_t i = 0; i < num_radio_configurations; i++) {
EXPECT_EQ(aidl_struct_util::convertLegacyMacBandToAidlWifiBand(radio_configuration->band),
radioCombination->radioConfigurations[i].bandInfo);
EXPECT_EQ(aidl_struct_util::convertLegacyAntennaConfigurationToAidl(
radio_configuration->antenna_cfg),
radioCombination->radioConfigurations[i].antennaMode);
radio_configuration++;
}
}
TEST_F(AidlStructUtilTest, canConvertLegacyRadioCombinationsMatrixToAidl) {
legacy_hal::wifi_radio_configuration radio_configurations_array1[] = {
{.band = legacy_hal::WLAN_MAC_2_4_BAND, .antenna_cfg = legacy_hal::WIFI_ANTENNA_1X1},
};
legacy_hal::wifi_radio_configuration radio_configurations_array2[] = {
{.band = legacy_hal::WLAN_MAC_2_4_BAND, .antenna_cfg = legacy_hal::WIFI_ANTENNA_2X2},
{.band = legacy_hal::WLAN_MAC_5_0_BAND, .antenna_cfg = legacy_hal::WIFI_ANTENNA_3X3},
};
legacy_hal::wifi_radio_configuration radio_configurations_array3[] = {
{.band = legacy_hal::WLAN_MAC_2_4_BAND, .antenna_cfg = legacy_hal::WIFI_ANTENNA_2X2},
{.band = legacy_hal::WLAN_MAC_6_0_BAND, .antenna_cfg = legacy_hal::WIFI_ANTENNA_1X1},
{.band = legacy_hal::WLAN_MAC_5_0_BAND, .antenna_cfg = legacy_hal::WIFI_ANTENNA_4X4},
};
int num_radio_configs = 0;
int num_combinations = 0;
std::array<char, 256> buffer;
buffer.fill(0);
legacy_hal::wifi_radio_combination_matrix* legacy_matrix =
reinterpret_cast<wifi_radio_combination_matrix*>(buffer.data());
legacy_hal::wifi_radio_combination* radio_combinations;
// Prepare a legacy wifi_radio_combination_matrix
legacy_matrix->num_radio_combinations = 3;
// Insert first combination
radio_combinations =
(legacy_hal::wifi_radio_combination*)((char*)legacy_matrix->radio_combinations);
insertRadioCombination(
radio_combinations,
sizeof(radio_configurations_array1) / sizeof(radio_configurations_array1[0]),
radio_configurations_array1);
num_combinations++;
num_radio_configs +=
sizeof(radio_configurations_array1) / sizeof(radio_configurations_array1[0]);
// Insert second combination
radio_combinations =
(legacy_hal::wifi_radio_combination*)((char*)legacy_matrix->radio_combinations +
(num_combinations *
sizeof(legacy_hal::wifi_radio_combination)) +
(num_radio_configs *
sizeof(wifi_radio_configuration)));
insertRadioCombination(
radio_combinations,
sizeof(radio_configurations_array2) / sizeof(radio_configurations_array2[0]),
radio_configurations_array2);
num_combinations++;
num_radio_configs +=
sizeof(radio_configurations_array2) / sizeof(radio_configurations_array2[0]);
// Insert third combination
radio_combinations =
(legacy_hal::wifi_radio_combination*)((char*)legacy_matrix->radio_combinations +
(num_combinations *
sizeof(legacy_hal::wifi_radio_combination)) +
(num_radio_configs *
sizeof(wifi_radio_configuration)));
insertRadioCombination(
radio_combinations,
sizeof(radio_configurations_array3) / sizeof(radio_configurations_array3[0]),
radio_configurations_array3);
std::vector<WifiRadioCombination> converted_combinations;
aidl_struct_util::convertLegacyRadioCombinationsMatrixToAidl(legacy_matrix,
&converted_combinations);
// Verify the conversion
EXPECT_EQ(legacy_matrix->num_radio_combinations, converted_combinations.size());
verifyRadioCombination(
&converted_combinations[0],
sizeof(radio_configurations_array1) / sizeof(radio_configurations_array1[0]),
radio_configurations_array1);
verifyRadioCombination(
&converted_combinations[1],
sizeof(radio_configurations_array2) / sizeof(radio_configurations_array2[0]),
radio_configurations_array2);
verifyRadioCombination(
&converted_combinations[2],
sizeof(radio_configurations_array3) / sizeof(radio_configurations_array3[0]),
radio_configurations_array3);
}
void verifyRttResult(wifi_rtt_result* legacy_rtt_result_ptr, RttResult* aidl_results_ptr) {
EXPECT_EQ((int)legacy_rtt_result_ptr->burst_num, aidl_results_ptr->burstNum);
EXPECT_EQ((int)legacy_rtt_result_ptr->measurement_number, aidl_results_ptr->measurementNumber);
EXPECT_EQ((int)legacy_rtt_result_ptr->success_number, aidl_results_ptr->successNumber);
EXPECT_EQ(legacy_rtt_result_ptr->number_per_burst_peer, aidl_results_ptr->numberPerBurstPeer);
EXPECT_EQ(legacy_rtt_result_ptr->retry_after_duration, aidl_results_ptr->retryAfterDuration);
EXPECT_EQ(legacy_rtt_result_ptr->rssi, aidl_results_ptr->rssi);
EXPECT_EQ(legacy_rtt_result_ptr->rssi_spread, aidl_results_ptr->rssiSpread);
EXPECT_EQ(legacy_rtt_result_ptr->rtt, aidl_results_ptr->rtt);
EXPECT_EQ(legacy_rtt_result_ptr->rtt_sd, aidl_results_ptr->rttSd);
EXPECT_EQ(legacy_rtt_result_ptr->rtt_spread, aidl_results_ptr->rttSpread);
EXPECT_EQ(legacy_rtt_result_ptr->distance_mm, aidl_results_ptr->distanceInMm);
EXPECT_EQ(legacy_rtt_result_ptr->distance_sd_mm, aidl_results_ptr->distanceSdInMm);
EXPECT_EQ(legacy_rtt_result_ptr->distance_spread_mm, aidl_results_ptr->distanceSpreadInMm);
EXPECT_EQ(legacy_rtt_result_ptr->ts, aidl_results_ptr->timeStampInUs);
EXPECT_EQ(legacy_rtt_result_ptr->burst_duration, aidl_results_ptr->burstDurationInMs);
EXPECT_EQ(legacy_rtt_result_ptr->negotiated_burst_num, aidl_results_ptr->negotiatedBurstNum);
EXPECT_EQ(legacy_rtt_result_ptr->LCI->id, aidl_results_ptr->lci.id);
for (int i = 0; i < legacy_rtt_result_ptr->LCI->len; i++) {
EXPECT_EQ(legacy_rtt_result_ptr->LCI->data[i], aidl_results_ptr->lci.data[i]);
}
EXPECT_EQ(legacy_rtt_result_ptr->LCR->id, aidl_results_ptr->lcr.id);
for (int i = 0; i < legacy_rtt_result_ptr->LCR->len; i++) {
EXPECT_EQ(legacy_rtt_result_ptr->LCR->data[i], aidl_results_ptr->lcr.data[i]);
}
}
void fillLegacyRttResult(wifi_rtt_result* rtt_result_ptr) {
std::copy(std::begin(kMacAddress), std::end(kMacAddress), std::begin(rtt_result_ptr->addr));
rtt_result_ptr->burst_num = rand();
rtt_result_ptr->measurement_number = rand();
rtt_result_ptr->success_number = rand();
rtt_result_ptr->number_per_burst_peer = 0xF & rand();
rtt_result_ptr->status = RTT_STATUS_SUCCESS;
rtt_result_ptr->retry_after_duration = 0xF & rand();
rtt_result_ptr->type = RTT_TYPE_2_SIDED;
rtt_result_ptr->rssi = rand();
rtt_result_ptr->rssi_spread = rand();
rtt_result_ptr->rtt = rand();
rtt_result_ptr->rtt_sd = rand();
rtt_result_ptr->rtt_spread = rand();
rtt_result_ptr->distance_mm = rand();
rtt_result_ptr->distance_sd_mm = rand();
rtt_result_ptr->distance_spread_mm = rand();
rtt_result_ptr->burst_duration = rand();
rtt_result_ptr->negotiated_burst_num = rand();
rtt_result_ptr->LCI = (wifi_information_element*)LCI;
rtt_result_ptr->LCR = (wifi_information_element*)LCR;
}
TEST_F(AidlStructUtilTest, convertLegacyVectorOfRttResultToAidl) {
std::vector<const wifi_rtt_result*> rtt_results_vec;
wifi_rtt_result rttResults[2];
// fill legacy rtt results
for (int i = 0; i < 2; i++) {
fillLegacyRttResult(&rttResults[i]);
rtt_results_vec.push_back(&rttResults[i]);
}
std::vector<RttResult> aidl_results;
aidl_struct_util::convertLegacyVectorOfRttResultToAidl(rtt_results_vec, &aidl_results);
EXPECT_EQ(rtt_results_vec.size(), aidl_results.size());
for (size_t i = 0; i < rtt_results_vec.size(); i++) {
verifyRttResult(&rttResults[i], &aidl_results[i]);
EXPECT_EQ(aidl_results[i].channelFreqMHz, 0);
EXPECT_EQ(aidl_results[i].packetBw, RttBw::BW_UNSPECIFIED);
}
}
TEST_F(AidlStructUtilTest, convertLegacyVectorOfRttResultV2ToAidl) {
std::vector<const wifi_rtt_result_v2*> rtt_results_vec_v2;
wifi_rtt_result_v2 rttResults_v2[2];
// fill legacy rtt results v2
for (int i = 0; i < 2; i++) {
fillLegacyRttResult(&rttResults_v2[i].rtt_result);
rttResults_v2[i].frequency = 2412 + i * 5;
rttResults_v2[i].packet_bw = WIFI_RTT_BW_80;
rtt_results_vec_v2.push_back(&rttResults_v2[i]);
}
std::vector<RttResult> aidl_results;
aidl_struct_util::convertLegacyVectorOfRttResultV2ToAidl(rtt_results_vec_v2, &aidl_results);
EXPECT_EQ(rtt_results_vec_v2.size(), aidl_results.size());
for (size_t i = 0; i < rtt_results_vec_v2.size(); i++) {
verifyRttResult(&rttResults_v2[i].rtt_result, &aidl_results[i]);
EXPECT_EQ(aidl_results[i].channelFreqMHz, rttResults_v2[i].frequency);
EXPECT_EQ(aidl_results[i].packetBw, RttBw::BW_80MHZ);
}
}
TEST_F(AidlStructUtilTest, convertCachedScanReportToAidl) {
legacy_hal::WifiCachedScanReport hw_report;
hw_report.ts = 10000000;
std::vector<int> scanned_freqs{5260, 2437, 5200};
std::vector<wifi_cached_scan_result> results;
hw_report.scanned_freqs = scanned_freqs;
for (int i = 0; i < kNumScanResult; i++) {
wifi_cached_scan_result result;
result.age_ms = i * 1000;
result.capability = i;
memcpy(result.ssid, kSsid, kSsidLen);
result.ssid_len = kSsidLen;
memcpy(result.bssid, kBssid, 6);
result.flags = WIFI_CACHED_SCAN_RESULT_FLAGS_HE_OPS_PRESENT;
result.rssi = kRssi[i];
result.chanspec = {legacy_hal::WIFI_CHAN_WIDTH_40, 0, 0, i};
results.push_back(result);
}
hw_report.results = results;
CachedScanData aidl_data;
aidl_struct_util::convertCachedScanReportToAidl(hw_report, &aidl_data);
EXPECT_EQ(scanned_freqs.size(), aidl_data.scannedFrequenciesMhz.size());
EXPECT_EQ(scanned_freqs[2], aidl_data.scannedFrequenciesMhz[2]);
EXPECT_EQ(5260, aidl_data.scannedFrequenciesMhz[0]);
EXPECT_EQ(kNumScanResult, (int)aidl_data.cachedScanResults.size());
for (int i = 0; i < kNumScanResult; i++) {
EXPECT_EQ(hw_report.results[i].rssi, aidl_data.cachedScanResults[i].rssiDbm);
EXPECT_EQ(i, aidl_data.cachedScanResults[i].frequencyMhz);
int64_t expected_ts = 10000000 - i * 1000 * 1000;
EXPECT_EQ(expected_ts, aidl_data.cachedScanResults[i].timeStampInUs);
EXPECT_EQ(WifiRatePreamble::HE, aidl_data.cachedScanResults[i].preambleType);
EXPECT_EQ(WifiChannelWidthInMhz::WIDTH_40, aidl_data.cachedScanResults[i].channelWidthMhz);
for (int k = 0; k < 6; k++) {
EXPECT_EQ(kBssid[k], aidl_data.cachedScanResults[i].bssid[k]);
}
for (int k = 0; k < kSsidLen; k++) {
EXPECT_EQ(kSsid[k], aidl_data.cachedScanResults[i].ssid[k]);
}
}
}
} // namespace wifi
} // namespace hardware
} // namespace android
} // namespace aidl