Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1a7b1db2 authored by Roshan Pius's avatar Roshan Pius
Browse files

wifi(implementation): Conversion functions for radio mode change

Bug: 68349158
Test: Unit tests
Change-Id: I608c42971d023637db20e78b0626164884950d70
parent 01f08770
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -94,6 +94,7 @@ include $(CLEAR_VARS)
LOCAL_MODULE := android.hardware.wifi@1.0-service-tests
LOCAL_PROPRIETARY_MODULE := true
LOCAL_SRC_FILES := \
    tests/hidl_struct_util_unit_tests.cpp \
    tests/main.cpp \
    tests/mock_wifi_feature_flags.cpp \
    tests/mock_wifi_legacy_hal.cpp \
+51 −0
Original line number Diff line number Diff line
@@ -266,6 +266,57 @@ legacy_hal::wifi_power_scenario convertHidlTxPowerScenarioToLegacy(
    CHECK(false);
}

bool convertLegacyWifiMacInfoToHidl(
    const legacy_hal::WifiMacInfo& legacy_mac_info,
    IWifiChipEventCallback::RadioModeInfo* hidl_radio_mode_info) {
    if (!hidl_radio_mode_info) {
        return false;
    }
    *hidl_radio_mode_info = {};

    hidl_radio_mode_info->radioId = legacy_mac_info.wlan_mac_id;
    // Convert from bitmask of bands in the legacy HAL to enum value in
    // the HIDL interface.
    if (legacy_mac_info.mac_band & legacy_hal::WLAN_MAC_2_4_BAND &&
        legacy_mac_info.mac_band & legacy_hal::WLAN_MAC_5_0_BAND) {
        hidl_radio_mode_info->bandInfo = WifiBand::BAND_24GHZ_5GHZ;
    } else if (legacy_mac_info.mac_band & legacy_hal::WLAN_MAC_2_4_BAND) {
        hidl_radio_mode_info->bandInfo = WifiBand::BAND_24GHZ;
    } else if (legacy_mac_info.mac_band & legacy_hal::WLAN_MAC_5_0_BAND) {
        hidl_radio_mode_info->bandInfo = WifiBand::BAND_5GHZ;
    } else {
        hidl_radio_mode_info->bandInfo = WifiBand::BAND_UNSPECIFIED;
    }
    std::vector<IWifiChipEventCallback::IfaceInfo> iface_info_vec;
    for (const auto& legacy_iface_info : legacy_mac_info.iface_infos) {
        IWifiChipEventCallback::IfaceInfo iface_info;
        iface_info.name = legacy_iface_info.name;
        iface_info.channel = legacy_iface_info.channel;
        iface_info_vec.push_back(iface_info);
    }
    hidl_radio_mode_info->ifaceInfos = iface_info_vec;
    return true;
}

bool convertLegacyWifiMacInfosToHidl(
    const std::vector<legacy_hal::WifiMacInfo>& legacy_mac_infos,
    std::vector<IWifiChipEventCallback::RadioModeInfo>* hidl_radio_mode_infos) {
    if (!hidl_radio_mode_infos) {
        return false;
    }
    *hidl_radio_mode_infos = {};

    for (const auto& legacy_mac_info : legacy_mac_infos) {
        IWifiChipEventCallback::RadioModeInfo hidl_radio_mode_info;
        if (!convertLegacyWifiMacInfoToHidl(legacy_mac_info,
                                            &hidl_radio_mode_info)) {
            return false;
        }
        hidl_radio_mode_infos->push_back(hidl_radio_mode_info);
    }
    return true;
}

bool convertLegacyFeaturesToHidlStaCapabilities(
    uint32_t legacy_feature_set, uint32_t legacy_logger_feature_set,
    uint32_t* hidl_caps) {
+4 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
#include <android/hardware/wifi/1.0/IWifiChip.h>
#include <android/hardware/wifi/1.0/types.h>
#include <android/hardware/wifi/1.1/IWifiChip.h>
#include <android/hardware/wifi/1.2/IWifiChipEventCallback.h>
#include <android/hardware/wifi/1.2/types.h>

#include "wifi_legacy_hal.h"
@@ -55,6 +56,9 @@ bool convertLegacyWakeReasonStatsToHidl(
    WifiDebugHostWakeReasonStats* hidl_stats);
legacy_hal::wifi_power_scenario convertHidlTxPowerScenarioToLegacy(
    V1_1::IWifiChip::TxPowerScenario hidl_scenario);
bool convertLegacyWifiMacInfosToHidl(
    const std::vector<legacy_hal::WifiMacInfo>& legacy_mac_infos,
    std::vector<IWifiChipEventCallback::RadioModeInfo>* hidl_radio_mode_infos);

// STA iface conversion methods.
bool convertLegacyFeaturesToHidlStaCapabilities(
+129 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2017, 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>

#undef NAN
#include "hidl_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";
}  // namespace
namespace android {
namespace hardware {
namespace wifi {
namespace V1_2 {
namespace implementation {
using namespace android::hardware::wifi::V1_0;

class HidlStructUtilTest : public Test {};

TEST_F(HidlStructUtilTest, CanConvertLegacyWifiMacInfosToHidlWithOneMac) {
    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> hidl_radio_mode_infos;
    ASSERT_TRUE(hidl_struct_util::convertLegacyWifiMacInfosToHidl(
        legacy_mac_infos, &hidl_radio_mode_infos));

    ASSERT_EQ(1u, hidl_radio_mode_infos.size());
    auto hidl_radio_mode_info1 = hidl_radio_mode_infos[0];
    EXPECT_EQ(legacy_mac_info1.wlan_mac_id, hidl_radio_mode_info1.radioId);
    EXPECT_EQ(WifiBand::BAND_24GHZ_5GHZ, hidl_radio_mode_info1.bandInfo);
    ASSERT_EQ(2u, hidl_radio_mode_info1.ifaceInfos.size());
    auto hidl_iface_info1 = hidl_radio_mode_info1.ifaceInfos[0];
    EXPECT_EQ(legacy_iface_info1.name, hidl_iface_info1.name);
    EXPECT_EQ(static_cast<uint32_t>(legacy_iface_info1.channel),
              hidl_iface_info1.channel);
    auto hidl_iface_info2 = hidl_radio_mode_info1.ifaceInfos[1];
    EXPECT_EQ(legacy_iface_info2.name, hidl_iface_info2.name);
    EXPECT_EQ(static_cast<uint32_t>(legacy_iface_info2.channel),
              hidl_iface_info2.channel);
}

TEST_F(HidlStructUtilTest, CanConvertLegacyWifiMacInfosToHidlWithTwoMac) {
    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> hidl_radio_mode_infos;
    ASSERT_TRUE(hidl_struct_util::convertLegacyWifiMacInfosToHidl(
        legacy_mac_infos, &hidl_radio_mode_infos));

    ASSERT_EQ(2u, hidl_radio_mode_infos.size());

    // Find mac info 1.
    const auto hidl_radio_mode_info1 = std::find_if(
        hidl_radio_mode_infos.begin(), hidl_radio_mode_infos.end(),
        [&legacy_mac_info1](const IWifiChipEventCallback::RadioModeInfo& x) {
            return x.radioId == legacy_mac_info1.wlan_mac_id;
        });
    ASSERT_NE(hidl_radio_mode_infos.end(), hidl_radio_mode_info1);
    EXPECT_EQ(WifiBand::BAND_5GHZ, hidl_radio_mode_info1->bandInfo);
    ASSERT_EQ(1u, hidl_radio_mode_info1->ifaceInfos.size());
    auto hidl_iface_info1 = hidl_radio_mode_info1->ifaceInfos[0];
    EXPECT_EQ(legacy_iface_info1.name, hidl_iface_info1.name);
    EXPECT_EQ(static_cast<uint32_t>(legacy_iface_info1.channel),
              hidl_iface_info1.channel);

    // Find mac info 2.
    const auto hidl_radio_mode_info2 = std::find_if(
        hidl_radio_mode_infos.begin(), hidl_radio_mode_infos.end(),
        [&legacy_mac_info2](const IWifiChipEventCallback::RadioModeInfo& x) {
            return x.radioId == legacy_mac_info2.wlan_mac_id;
        });
    ASSERT_NE(hidl_radio_mode_infos.end(), hidl_radio_mode_info2);
    EXPECT_EQ(WifiBand::BAND_24GHZ, hidl_radio_mode_info2->bandInfo);
    ASSERT_EQ(1u, hidl_radio_mode_info2->ifaceInfos.size());
    auto hidl_iface_info2 = hidl_radio_mode_info2->ifaceInfos[0];
    EXPECT_EQ(legacy_iface_info2.name, hidl_iface_info2.name);
    EXPECT_EQ(static_cast<uint32_t>(legacy_iface_info2.channel),
              hidl_iface_info2.channel);
}
}  // namespace implementation
}  // namespace V1_2
}  // namespace wifi
}  // namespace hardware
}  // namespace android