From 046257fd2e916ced9a16596d66e003402b90dce2 Mon Sep 17 00:00:00 2001 From: Ahmed ElArabawy Date: Thu, 7 Nov 2019 18:27:23 -0800 Subject: [PATCH] Wifi: Support check on device capability for 6GHZ This commit adds the HAL APIs and implementation to support checking whether device supports 6GHz band or not. VTS test has been added for the new api. Bug: 139354972 Test: Manual: Make sure capability is read correctly. Test: VTS test. Change-Id: I03b0c6017666ffd3663d5979d6e6a2bd93043c48 --- wifi/1.4/Android.bp | 1 + wifi/1.4/IWifiStaIface.hal | 50 +++++++++++++++ wifi/1.4/default/hidl_struct_util.cpp | 9 ++- wifi/1.4/default/hidl_struct_util.h | 3 +- wifi/1.4/default/wifi_legacy_hal.cpp | 2 +- wifi/1.4/default/wifi_sta_iface.cpp | 51 +++++++++------ wifi/1.4/default/wifi_sta_iface.h | 7 ++- .../functional/wifi_sta_iface_hidl_test.cpp | 62 +++++++++++++++++++ 8 files changed, 158 insertions(+), 27 deletions(-) create mode 100644 wifi/1.4/IWifiStaIface.hal create mode 100644 wifi/1.4/vts/functional/wifi_sta_iface_hidl_test.cpp diff --git a/wifi/1.4/Android.bp b/wifi/1.4/Android.bp index e19785967a..5750e426ad 100644 --- a/wifi/1.4/Android.bp +++ b/wifi/1.4/Android.bp @@ -13,6 +13,7 @@ hidl_interface { "IWifiChip.hal", "IWifiRttController.hal", "IWifiRttControllerEventCallback.hal", + "IWifiStaIface.hal", ], interfaces: [ "android.hardware.wifi@1.0", diff --git a/wifi/1.4/IWifiStaIface.hal b/wifi/1.4/IWifiStaIface.hal new file mode 100644 index 0000000000..fb658cd37c --- /dev/null +++ b/wifi/1.4/IWifiStaIface.hal @@ -0,0 +1,50 @@ +/* + * Copyright 2019 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. + */ + +package android.hardware.wifi@1.4; + +import @1.0::WifiStatus; +import @1.0::MacAddress; +import @1.0::IWifiStaIface; +import @1.3::IWifiStaIface; + +/** + * Interface used to represent a single STA iface. + * + * IWifiChip.createStaIface() may return a @1.4::IWifiStaIface when supported. + */ +interface IWifiStaIface extends @1.3::IWifiStaIface { + + enum StaIfaceCapabilityMask : @1.0::IWifiStaIface.StaIfaceCapabilityMask { + STA_6G = 1 << 15 + }; + + /** + * Get the capabilities supported by this STA iface. + * + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|, + * |WifiStatusCode.ERROR_NOT_AVAILABLE|, + * |WifiStatusCode.ERROR_NOT_SUPPORTED|, + * |WifiStatusCode.ERROR_UNKNOWN| + * @return capabilities Bitset of |StaIfaceCapabilityMask| values. + */ + getCapabilities_1_4() + generates (WifiStatus status, + bitfield capabilities); +}; diff --git a/wifi/1.4/default/hidl_struct_util.cpp b/wifi/1.4/default/hidl_struct_util.cpp index 61f311ec24..13a09f3438 100644 --- a/wifi/1.4/default/hidl_struct_util.cpp +++ b/wifi/1.4/default/hidl_struct_util.cpp @@ -91,7 +91,7 @@ V1_3::IWifiChip::ChipCapabilityMask convertLegacyFeatureToHidlChipCapability( } IWifiStaIface::StaIfaceCapabilityMask -convertLegacyFeatureToHidlStaIfaceCapability(uint32_t feature) { +convertLegacyFeatureToHidlStaIfaceCapability(uint64_t feature) { using HidlStaIfaceCaps = IWifiStaIface::StaIfaceCapabilityMask; switch (feature) { case WIFI_FEATURE_GSCAN: @@ -120,6 +120,8 @@ convertLegacyFeatureToHidlStaIfaceCapability(uint32_t feature) { return HidlStaIfaceCaps::ND_OFFLOAD; case WIFI_FEATURE_MKEEP_ALIVE: return HidlStaIfaceCaps::KEEP_ALIVE; + case WIFI_FEATURE_INFRA_6G: + return HidlStaIfaceCaps::STA_6G; }; CHECK(false) << "Unknown legacy feature: " << feature; return {}; @@ -365,7 +367,7 @@ bool convertLegacyWifiMacInfosToHidl( } bool convertLegacyFeaturesToHidlStaCapabilities( - uint32_t legacy_feature_set, uint32_t legacy_logger_feature_set, + uint64_t legacy_feature_set, uint32_t legacy_logger_feature_set, uint32_t* hidl_caps) { if (!hidl_caps) { return false; @@ -384,7 +386,8 @@ bool convertLegacyFeaturesToHidlStaCapabilities( WIFI_FEATURE_IE_WHITELIST, WIFI_FEATURE_SCAN_RAND, WIFI_FEATURE_INFRA_5G, WIFI_FEATURE_HOTSPOT, WIFI_FEATURE_PNO, WIFI_FEATURE_TDLS, WIFI_FEATURE_TDLS_OFFCHANNEL, - WIFI_FEATURE_CONFIG_NDO, WIFI_FEATURE_MKEEP_ALIVE}) { + WIFI_FEATURE_CONFIG_NDO, WIFI_FEATURE_MKEEP_ALIVE, + WIFI_FEATURE_INFRA_6G}) { if (feature & legacy_feature_set) { *hidl_caps |= convertLegacyFeatureToHidlStaIfaceCapability(feature); } diff --git a/wifi/1.4/default/hidl_struct_util.h b/wifi/1.4/default/hidl_struct_util.h index a99c1ac051..cfaa4adccc 100644 --- a/wifi/1.4/default/hidl_struct_util.h +++ b/wifi/1.4/default/hidl_struct_util.h @@ -25,6 +25,7 @@ #include #include #include +#include #include #include "wifi_legacy_hal.h" @@ -69,7 +70,7 @@ bool convertLegacyWifiMacInfosToHidl( // STA iface conversion methods. bool convertLegacyFeaturesToHidlStaCapabilities( - uint32_t legacy_feature_set, uint32_t legacy_logger_feature_set, + uint64_t legacy_feature_set, uint32_t legacy_logger_feature_set, uint32_t* hidl_caps); bool convertLegacyApfCapabilitiesToHidl( const legacy_hal::PacketFilterCapabilities& legacy_caps, diff --git a/wifi/1.4/default/wifi_legacy_hal.cpp b/wifi/1.4/default/wifi_legacy_hal.cpp index 8139253272..ae3c447a01 100644 --- a/wifi/1.4/default/wifi_legacy_hal.cpp +++ b/wifi/1.4/default/wifi_legacy_hal.cpp @@ -479,7 +479,7 @@ WifiLegacyHal::requestFirmwareMemoryDump(const std::string& iface_name) { std::pair WifiLegacyHal::getSupportedFeatureSet( const std::string& iface_name) { feature_set set; - static_assert(sizeof(set) == sizeof(uint32_t), + static_assert(sizeof(set) == sizeof(uint64_t), "Some feature_flags can not be represented in output"); wifi_error status = global_func_table_.wifi_get_supported_feature_set( getIfaceHandle(iface_name), &set); diff --git a/wifi/1.4/default/wifi_sta_iface.cpp b/wifi/1.4/default/wifi_sta_iface.cpp index 3e0127ed2a..8e1ada1032 100644 --- a/wifi/1.4/default/wifi_sta_iface.cpp +++ b/wifi/1.4/default/wifi_sta_iface.cpp @@ -266,6 +266,13 @@ Return WifiStaIface::getFactoryMacAddress( hidl_status_cb); } +Return WifiStaIface::getCapabilities_1_4( + getCapabilities_cb hidl_status_cb) { + return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, + &WifiStaIface::getCapabilitiesInternal_1_4, + hidl_status_cb); +} + std::pair WifiStaIface::getNameInternal() { return {createWifiStatus(WifiStatusCode::SUCCESS), ifname_}; } @@ -283,26 +290,7 @@ WifiStatus WifiStaIface::registerEventCallbackInternal( } std::pair WifiStaIface::getCapabilitiesInternal() { - legacy_hal::wifi_error legacy_status; - uint32_t legacy_feature_set; - std::tie(legacy_status, legacy_feature_set) = - legacy_hal_.lock()->getSupportedFeatureSet(ifname_); - if (legacy_status != legacy_hal::WIFI_SUCCESS) { - return {createWifiStatusFromLegacyError(legacy_status), 0}; - } - uint32_t legacy_logger_feature_set; - std::tie(legacy_status, legacy_logger_feature_set) = - legacy_hal_.lock()->getLoggerSupportedFeatureSet(ifname_); - if (legacy_status != legacy_hal::WIFI_SUCCESS) { - // some devices don't support querying logger feature set - legacy_logger_feature_set = 0; - } - uint32_t hidl_caps; - if (!hidl_struct_util::convertLegacyFeaturesToHidlStaCapabilities( - legacy_feature_set, legacy_logger_feature_set, &hidl_caps)) { - return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), 0}; - } - return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps}; + return {createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED), 0}; } std::pair @@ -640,6 +628,29 @@ WifiStaIface::getFactoryMacAddressInternal() { return {createWifiStatus(WifiStatusCode::SUCCESS), mac}; } +std::pair WifiStaIface::getCapabilitiesInternal_1_4() { + legacy_hal::wifi_error legacy_status; + uint64_t legacy_feature_set; + std::tie(legacy_status, legacy_feature_set) = + legacy_hal_.lock()->getSupportedFeatureSet(ifname_); + if (legacy_status != legacy_hal::WIFI_SUCCESS) { + return {createWifiStatusFromLegacyError(legacy_status), 0}; + } + uint32_t legacy_logger_feature_set; + std::tie(legacy_status, legacy_logger_feature_set) = + legacy_hal_.lock()->getLoggerSupportedFeatureSet(ifname_); + if (legacy_status != legacy_hal::WIFI_SUCCESS) { + // some devices don't support querying logger feature set + legacy_logger_feature_set = 0; + } + uint32_t hidl_caps; + if (!hidl_struct_util::convertLegacyFeaturesToHidlStaCapabilities( + legacy_feature_set, legacy_logger_feature_set, &hidl_caps)) { + return {createWifiStatus(WifiStatusCode::ERROR_UNKNOWN), 0}; + } + return {createWifiStatus(WifiStatusCode::SUCCESS), hidl_caps}; +} + } // namespace implementation } // namespace V1_4 } // namespace wifi diff --git a/wifi/1.4/default/wifi_sta_iface.h b/wifi/1.4/default/wifi_sta_iface.h index d8f7a01ade..ccf234f98e 100644 --- a/wifi/1.4/default/wifi_sta_iface.h +++ b/wifi/1.4/default/wifi_sta_iface.h @@ -19,7 +19,7 @@ #include #include -#include +#include #include "hidl_callback_util.h" #include "wifi_iface_util.h" @@ -35,7 +35,7 @@ using namespace android::hardware::wifi::V1_0; /** * HIDL interface object used to control a STA Iface instance. */ -class WifiStaIface : public V1_3::IWifiStaIface { +class WifiStaIface : public V1_4::IWifiStaIface { public: WifiStaIface(const std::string& ifname, const std::weak_ptr legacy_hal, @@ -111,6 +111,8 @@ class WifiStaIface : public V1_3::IWifiStaIface { setMacAddress_cb hidl_status_cb) override; Return getFactoryMacAddress( getFactoryMacAddress_cb hidl_status_cb) override; + Return getCapabilities_1_4( + getCapabilities_1_4_cb hidl_status_cb) override; private: // Corresponding worker functions for the HIDL methods. @@ -159,6 +161,7 @@ class WifiStaIface : public V1_3::IWifiStaIface { WifiStatus setMacAddressInternal(const std::array& mac); std::pair> getFactoryMacAddressInternal(); + std::pair getCapabilitiesInternal_1_4(); std::string ifname_; std::weak_ptr legacy_hal_; diff --git a/wifi/1.4/vts/functional/wifi_sta_iface_hidl_test.cpp b/wifi/1.4/vts/functional/wifi_sta_iface_hidl_test.cpp new file mode 100644 index 0000000000..ec4b2c949d --- /dev/null +++ b/wifi/1.4/vts/functional/wifi_sta_iface_hidl_test.cpp @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Staache 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 + +#include + +#include + +#include "wifi_hidl_call_util.h" +#include "wifi_hidl_test_utils.h" + +using ::android::sp; +using ::android::hardware::hidl_array; +using ::android::hardware::wifi::V1_0::WifiStatus; +using ::android::hardware::wifi::V1_0::WifiStatusCode; +using ::android::hardware::wifi::V1_4::IWifiStaIface; + +/** + * Fixture to use for all STA Iface HIDL interface tests. + */ +class WifiStaIfaceHidlTest : public ::testing::VtsHalHidlTargetTestBase { + public: + virtual void SetUp() override { + wifi_sta_iface_ = IWifiStaIface::castFrom(getWifiStaIface()); + ASSERT_NE(nullptr, wifi_sta_iface_.get()); + } + + virtual void TearDown() override { stopWifi(); } + + protected: + sp wifi_sta_iface_; +}; + +/* + * GetCapabilities_1_4 + */ +TEST_F(WifiStaIfaceHidlTest, GetCapabilities_1_4) { + configureChipForIfaceType(IfaceType::STA, true); + + const auto& status_and_caps = + HIDL_INVOKE(wifi_sta_iface_, getCapabilities_1_4); + if (status_and_caps.first.code != WifiStatusCode::SUCCESS) { + EXPECT_EQ(WifiStatusCode::ERROR_NOT_SUPPORTED, + status_and_caps.first.code); + return; + } + EXPECT_NE(0u, status_and_caps.second); +}