From fd809fcdfce151d5f948198c88ed35fbcf99c8df Mon Sep 17 00:00:00 2001 From: Ahmed ElArabawy Date: Fri, 15 Nov 2019 18:19:15 -0800 Subject: [PATCH] Wifi: Add 6GHz bands to WifiBand This commit adds 6GHz band to WifiBand and update the impacted structures and methods in Wifi HAL. Note that Background scar related HAL API will not be using the new band, and will continue with the legacy set of bands. Bug: 139354972 Test: Manual Test: VTS test Test: Unit test: ./hardware/interfaces/wifi/1.4/default/tests/runtests.sh Change-Id: I54662251034806338ad64d4622ade259ca260a79 --- wifi/1.4/Android.bp | 1 + wifi/1.4/IWifiChip.hal | 17 +++ wifi/1.4/IWifiChipEventCallback.hal | 65 +++++++++ wifi/1.4/default/hidl_struct_util.cpp | 36 +++-- wifi/1.4/default/hidl_struct_util.h | 7 +- .../tests/hidl_struct_util_unit_tests.cpp | 28 ++-- wifi/1.4/default/wifi_ap_iface.cpp | 4 +- wifi/1.4/default/wifi_ap_iface.h | 5 +- wifi/1.4/default/wifi_chip.cpp | 32 +++-- wifi/1.4/default/wifi_chip.h | 10 +- wifi/1.4/default/wifi_sta_iface.cpp | 4 +- wifi/1.4/default/wifi_sta_iface.h | 5 +- wifi/1.4/types.hal | 23 +++ wifi/1.4/vts/functional/Android.bp | 1 + .../vts/functional/wifi_chip_hidl_test.cpp | 135 ++++++++++++++++++ 15 files changed, 320 insertions(+), 53 deletions(-) create mode 100644 wifi/1.4/IWifiChipEventCallback.hal create mode 100644 wifi/1.4/vts/functional/wifi_chip_hidl_test.cpp diff --git a/wifi/1.4/Android.bp b/wifi/1.4/Android.bp index 5750e426ad..e63b1ebaed 100644 --- a/wifi/1.4/Android.bp +++ b/wifi/1.4/Android.bp @@ -11,6 +11,7 @@ hidl_interface { "IWifi.hal", "IWifiApIface.hal", "IWifiChip.hal", + "IWifiChipEventCallback.hal", "IWifiRttController.hal", "IWifiRttControllerEventCallback.hal", "IWifiStaIface.hal", diff --git a/wifi/1.4/IWifiChip.hal b/wifi/1.4/IWifiChip.hal index d269427a6d..de5a64e1b9 100644 --- a/wifi/1.4/IWifiChip.hal +++ b/wifi/1.4/IWifiChip.hal @@ -19,12 +19,29 @@ package android.hardware.wifi@1.4; import @1.0::WifiStatus; import @1.0::IWifiIface; import @1.3::IWifiChip; +import IWifiChipEventCallback; import IWifiRttController; /** * Interface that represents a chip that must be configured as a single unit. */ interface IWifiChip extends @1.3::IWifiChip { + /** + * Requests notifications of significant events on this chip. Multiple calls + * to this must register multiple callbacks each of which must receive all + * events. + * + * @param callback An instance of the |IWifiChipEventCallback| HIDL interface + * object. + * @return status WifiStatus of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.ERROR_NOT_SUPPORTED|, + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID| + */ + registerEventCallback_1_4(IWifiChipEventCallback callback) + generates (WifiStatus status); + /** * Create a RTTController instance. * diff --git a/wifi/1.4/IWifiChipEventCallback.hal b/wifi/1.4/IWifiChipEventCallback.hal new file mode 100644 index 0000000000..ecd0a44b6f --- /dev/null +++ b/wifi/1.4/IWifiChipEventCallback.hal @@ -0,0 +1,65 @@ +/* + * 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.2::IWifiChipEventCallback; +import WifiBand; + +/** + * Wifi chip event callbacks. + */ +interface IWifiChipEventCallback extends @1.2::IWifiChipEventCallback { + /** + * Struct describing the state of each hardware radio chain (hardware MAC) + * on the device. + */ + struct RadioModeInfo { + /** + * Identifier for this radio chain. This is vendor dependent & used + * only for debugging purposes. + */ + uint32_t radioId; + /** + * List of bands on which this radio chain is operating. + * Can be one of: + * a) WifiBand.BAND_24GHZ => 2.4Ghz. + * b) WifiBand.BAND_5GHZ => 5Ghz. + * c) WifiBand.BAND_24GHZ_5GHZ = 2.4Ghz + 5Ghz (Radio is time sharing + * across the 2 bands). + * d) WifiBand.BAND_6GHZ => 6Ghz. + * e) WifiBand.BAND_5GHZ_6GHZ => 5Ghz + 6Ghz (Radio is time sharing + * across the 2 bands). + * f) WifiBand.BAND_24GHZ_5GHZ_6GHZ => 2.4Ghz + 5Ghz + 6Ghz (Radio is + * time sharing across the 3 bands). + */ + WifiBand bandInfo; + /** List of interfaces on this radio chain (hardware MAC). */ + vec ifaceInfos; + }; + + /** + * Asynchronous callback indicating a radio mode change. + * Radio mode change could be a result of: + * a) Bringing up concurrent interfaces (For ex: STA + AP). + * b) Change in operating band of one of the concurrent interfaces (For ex: + * STA connection moved from 2.4G to 5G) + * + * @param radioModeInfos List of RadioModeInfo structures for each + * radio chain (hardware MAC) on the device. + */ + oneway onRadioModeChange_1_4(vec radioModeInfos); +}; diff --git a/wifi/1.4/default/hidl_struct_util.cpp b/wifi/1.4/default/hidl_struct_util.cpp index 6eeb6422e5..35c683984d 100644 --- a/wifi/1.4/default/hidl_struct_util.cpp +++ b/wifi/1.4/default/hidl_struct_util.cpp @@ -316,7 +316,7 @@ legacy_hal::wifi_latency_mode convertHidlLatencyModeToLegacy( bool convertLegacyWifiMacInfoToHidl( const legacy_hal::WifiMacInfo& legacy_mac_info, - V1_2::IWifiChipEventCallback::RadioModeInfo* hidl_radio_mode_info) { + IWifiChipEventCallback::RadioModeInfo* hidl_radio_mode_info) { if (!hidl_radio_mode_info) { return false; } @@ -325,8 +325,17 @@ bool convertLegacyWifiMacInfoToHidl( 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) { + if (legacy_mac_info.mac_band & legacy_hal::WLAN_MAC_6_0_BAND && + legacy_mac_info.mac_band & legacy_hal::WLAN_MAC_5_0_BAND && + legacy_mac_info.mac_band & legacy_hal::WLAN_MAC_2_4_BAND) { + hidl_radio_mode_info->bandInfo = WifiBand::BAND_24GHZ_5GHZ_6GHZ; + } else if (legacy_mac_info.mac_band & legacy_hal::WLAN_MAC_6_0_BAND && + legacy_mac_info.mac_band & legacy_hal::WLAN_MAC_5_0_BAND) { + hidl_radio_mode_info->bandInfo = WifiBand::BAND_5GHZ_6GHZ; + } else if (legacy_mac_info.mac_band & legacy_hal::WLAN_MAC_6_0_BAND) { + hidl_radio_mode_info->bandInfo = WifiBand::BAND_6GHZ; + } else 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; @@ -348,15 +357,14 @@ bool convertLegacyWifiMacInfoToHidl( bool convertLegacyWifiMacInfosToHidl( const std::vector& legacy_mac_infos, - std::vector* - hidl_radio_mode_infos) { + std::vector* hidl_radio_mode_infos) { if (!hidl_radio_mode_infos) { return false; } *hidl_radio_mode_infos = {}; for (const auto& legacy_mac_info : legacy_mac_infos) { - V1_2::IWifiChipEventCallback::RadioModeInfo hidl_radio_mode_info; + IWifiChipEventCallback::RadioModeInfo hidl_radio_mode_info; if (!convertLegacyWifiMacInfoToHidl(legacy_mac_info, &hidl_radio_mode_info)) { return false; @@ -449,21 +457,21 @@ bool convertLegacyGscanCapabilitiesToHidl( return true; } -legacy_hal::wifi_band convertHidlWifiBandToLegacy(WifiBand band) { +legacy_hal::wifi_band convertHidlWifiBandToLegacy(V1_0::WifiBand band) { switch (band) { - case WifiBand::BAND_UNSPECIFIED: + case V1_0::WifiBand::BAND_UNSPECIFIED: return legacy_hal::WIFI_BAND_UNSPECIFIED; - case WifiBand::BAND_24GHZ: + case V1_0::WifiBand::BAND_24GHZ: return legacy_hal::WIFI_BAND_BG; - case WifiBand::BAND_5GHZ: + case V1_0::WifiBand::BAND_5GHZ: return legacy_hal::WIFI_BAND_A; - case WifiBand::BAND_5GHZ_DFS: + case V1_0::WifiBand::BAND_5GHZ_DFS: return legacy_hal::WIFI_BAND_A_DFS; - case WifiBand::BAND_5GHZ_WITH_DFS: + case V1_0::WifiBand::BAND_5GHZ_WITH_DFS: return legacy_hal::WIFI_BAND_A_WITH_DFS; - case WifiBand::BAND_24GHZ_5GHZ: + case V1_0::WifiBand::BAND_24GHZ_5GHZ: return legacy_hal::WIFI_BAND_ABG; - case WifiBand::BAND_24GHZ_5GHZ_WITH_DFS: + case V1_0::WifiBand::BAND_24GHZ_5GHZ_WITH_DFS: return legacy_hal::WIFI_BAND_ABG_WITH_DFS; }; CHECK(false); diff --git a/wifi/1.4/default/hidl_struct_util.h b/wifi/1.4/default/hidl_struct_util.h index cfaa4adccc..987891b5b2 100644 --- a/wifi/1.4/default/hidl_struct_util.h +++ b/wifi/1.4/default/hidl_struct_util.h @@ -21,10 +21,10 @@ #include #include -#include #include #include #include +#include #include #include @@ -65,8 +65,7 @@ legacy_hal::wifi_power_scenario convertHidlTxPowerScenarioToLegacy_1_2( V1_2::IWifiChip::TxPowerScenario hidl_scenario); bool convertLegacyWifiMacInfosToHidl( const std::vector& legacy_mac_infos, - std::vector* - hidl_radio_mode_infos); + std::vector* hidl_radio_mode_infos); // STA iface conversion methods. bool convertLegacyFeaturesToHidlStaCapabilities( @@ -78,7 +77,7 @@ bool convertLegacyApfCapabilitiesToHidl( bool convertLegacyGscanCapabilitiesToHidl( const legacy_hal::wifi_gscan_capabilities& legacy_caps, StaBackgroundScanCapabilities* hidl_caps); -legacy_hal::wifi_band convertHidlWifiBandToLegacy(WifiBand band); +legacy_hal::wifi_band convertHidlWifiBandToLegacy(V1_0::WifiBand band); bool convertHidlGscanParamsToLegacy( const StaBackgroundScanParameters& hidl_scan_params, legacy_hal::wifi_scan_cmd_params* legacy_scan_params); diff --git a/wifi/1.4/default/tests/hidl_struct_util_unit_tests.cpp b/wifi/1.4/default/tests/hidl_struct_util_unit_tests.cpp index 14a15048fe..b71d549d9c 100644 --- a/wifi/1.4/default/tests/hidl_struct_util_unit_tests.cpp +++ b/wifi/1.4/default/tests/hidl_struct_util_unit_tests.cpp @@ -55,8 +55,7 @@ TEST_F(HidlStructUtilTest, CanConvertLegacyWifiMacInfosToHidlWithOneMac) { legacy_mac_info1.iface_infos.push_back(legacy_iface_info2); legacy_mac_infos.push_back(legacy_mac_info1); - std::vector - hidl_radio_mode_infos; + std::vector hidl_radio_mode_infos; ASSERT_TRUE(hidl_struct_util::convertLegacyWifiMacInfosToHidl( legacy_mac_infos, &hidl_radio_mode_infos)); @@ -90,20 +89,18 @@ TEST_F(HidlStructUtilTest, CanConvertLegacyWifiMacInfosToHidlWithTwoMac) { legacy_mac_info2.iface_infos.push_back(legacy_iface_info2); legacy_mac_infos.push_back(legacy_mac_info2); - std::vector - hidl_radio_mode_infos; + std::vector 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 V1_2::IWifiChipEventCallback::RadioModeInfo& x) { - return x.radioId == legacy_mac_info1.wlan_mac_id; - }); + 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()); @@ -113,12 +110,11 @@ TEST_F(HidlStructUtilTest, CanConvertLegacyWifiMacInfosToHidlWithTwoMac) { 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 V1_2::IWifiChipEventCallback::RadioModeInfo& x) { - return x.radioId == legacy_mac_info2.wlan_mac_id; - }); + 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()); diff --git a/wifi/1.4/default/wifi_ap_iface.cpp b/wifi/1.4/default/wifi_ap_iface.cpp index e677f197b8..8777a4cb9c 100644 --- a/wifi/1.4/default/wifi_ap_iface.cpp +++ b/wifi/1.4/default/wifi_ap_iface.cpp @@ -64,7 +64,7 @@ Return WifiApIface::setCountryCode(const hidl_array& code, } Return WifiApIface::getValidFrequenciesForBand( - WifiBand band, getValidFrequenciesForBand_cb hidl_status_cb) { + V1_0::WifiBand band, getValidFrequenciesForBand_cb hidl_status_cb) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiApIface::getValidFrequenciesForBandInternal, hidl_status_cb, band); @@ -100,7 +100,7 @@ WifiStatus WifiApIface::setCountryCodeInternal( } std::pair> -WifiApIface::getValidFrequenciesForBandInternal(WifiBand band) { +WifiApIface::getValidFrequenciesForBandInternal(V1_0::WifiBand band) { static_assert(sizeof(WifiChannelInMhz) == sizeof(uint32_t), "Size mismatch"); legacy_hal::wifi_error legacy_status; diff --git a/wifi/1.4/default/wifi_ap_iface.h b/wifi/1.4/default/wifi_ap_iface.h index 4f3438c298..bf16d5eb85 100644 --- a/wifi/1.4/default/wifi_ap_iface.h +++ b/wifi/1.4/default/wifi_ap_iface.h @@ -49,7 +49,8 @@ class WifiApIface : public V1_4::IWifiApIface { Return setCountryCode(const hidl_array& code, setCountryCode_cb hidl_status_cb) override; Return getValidFrequenciesForBand( - WifiBand band, getValidFrequenciesForBand_cb hidl_status_cb) override; + V1_0::WifiBand band, + getValidFrequenciesForBand_cb hidl_status_cb) override; Return setMacAddress(const hidl_array& mac, setMacAddress_cb hidl_status_cb) override; Return getFactoryMacAddress( @@ -61,7 +62,7 @@ class WifiApIface : public V1_4::IWifiApIface { std::pair getTypeInternal(); WifiStatus setCountryCodeInternal(const std::array& code); std::pair> - getValidFrequenciesForBandInternal(WifiBand band); + getValidFrequenciesForBandInternal(V1_0::WifiBand band); WifiStatus setMacAddressInternal(const std::array& mac); std::pair> getFactoryMacAddressInternal(); diff --git a/wifi/1.4/default/wifi_chip.cpp b/wifi/1.4/default/wifi_chip.cpp index 40f73b532a..2b015d3115 100644 --- a/wifi/1.4/default/wifi_chip.cpp +++ b/wifi/1.4/default/wifi_chip.cpp @@ -341,7 +341,7 @@ void WifiChip::invalidate() { bool WifiChip::isValid() { return is_valid_; } -std::set> WifiChip::getEventCallbacks() { +std::set> WifiChip::getEventCallbacks() { return event_cb_handler_.getCallbacks(); } @@ -628,6 +628,14 @@ Return WifiChip::createRttController_1_4( hidl_status_cb, bound_iface); } +Return WifiChip::registerEventCallback_1_4( + const sp& event_callback, + registerEventCallback_cb hidl_status_cb) { + return validateAndCall(this, WifiStatusCode::ERROR_WIFI_CHIP_INVALID, + &WifiChip::registerEventCallbackInternal_1_4, + hidl_status_cb, event_callback); +} + void WifiChip::invalidateAndRemoveAllIfaces() { invalidateAndClearAll(ap_ifaces_); invalidateAndClearAll(nan_ifaces_); @@ -1125,11 +1133,9 @@ WifiStatus WifiChip::setLatencyModeInternal(LatencyMode mode) { } WifiStatus WifiChip::registerEventCallbackInternal_1_2( - const sp& event_callback) { - if (!event_cb_handler_.addCallback(event_callback)) { - return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN); - } - return createWifiStatus(WifiStatusCode::SUCCESS); + const sp& /* event_callback */) { + // Deprecated support for this callback. + return createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED); } WifiStatus WifiChip::selectTxPowerScenarioInternal_1_2( @@ -1179,6 +1185,14 @@ WifiChip::createRttControllerInternal_1_4(const sp& bound_iface) { return {createWifiStatus(WifiStatusCode::SUCCESS), rtt}; } +WifiStatus WifiChip::registerEventCallbackInternal_1_4( + const sp& event_callback) { + if (!event_cb_handler_.addCallback(event_callback)) { + return createWifiStatus(WifiStatusCode::ERROR_UNKNOWN); + } + return createWifiStatus(WifiStatusCode::SUCCESS); +} + WifiStatus WifiChip::handleChipConfiguration( /* NONNULL */ std::unique_lock* lock, ChipModeId mode_id) { @@ -1281,7 +1295,7 @@ WifiStatus WifiChip::registerRadioModeChangeCallback() { LOG(ERROR) << "Callback invoked on an invalid object"; return; } - std::vector + std::vector hidl_radio_mode_infos; if (!hidl_struct_util::convertLegacyWifiMacInfosToHidl( mac_infos, &hidl_radio_mode_infos)) { @@ -1289,9 +1303,9 @@ WifiStatus WifiChip::registerRadioModeChangeCallback() { return; } for (const auto& callback : shared_ptr_this->getEventCallbacks()) { - if (!callback->onRadioModeChange(hidl_radio_mode_infos) + if (!callback->onRadioModeChange_1_4(hidl_radio_mode_infos) .isOk()) { - LOG(ERROR) << "Failed to invoke onRadioModeChange" + LOG(ERROR) << "Failed to invoke onRadioModeChange_1_4" << " callback on: " << toString(callback); } } diff --git a/wifi/1.4/default/wifi_chip.h b/wifi/1.4/default/wifi_chip.h index 3bf18475ae..c76eabf18e 100644 --- a/wifi/1.4/default/wifi_chip.h +++ b/wifi/1.4/default/wifi_chip.h @@ -71,7 +71,7 @@ class WifiChip : public V1_4::IWifiChip { // marked valid before processing them. void invalidate(); bool isValid(); - std::set> getEventCallbacks(); + std::set> getEventCallbacks(); // HIDL methods exposed. Return getId(getId_cb hidl_status_cb) override; @@ -156,6 +156,9 @@ class WifiChip : public V1_4::IWifiChip { Return createRttController_1_4( const sp& bound_iface, createRttController_1_4_cb hidl_status_cb) override; + Return registerEventCallback_1_4( + const sp& event_callback, + registerEventCallback_1_4_cb hidl_status_cb) override; private: void invalidateAndRemoveAllIfaces(); @@ -223,6 +226,9 @@ class WifiChip : public V1_4::IWifiChip { std::pair getCapabilitiesInternal_1_3(); std::pair> createRttControllerInternal_1_4(const sp& bound_iface); + WifiStatus registerEventCallbackInternal_1_4( + const sp& event_callback); + WifiStatus handleChipConfiguration( std::unique_lock* lock, ChipModeId mode_id); WifiStatus registerDebugRingBufferCallback(); @@ -271,7 +277,7 @@ class WifiChip : public V1_4::IWifiChip { // registration mechanism. Use this to check if we have already // registered a callback. bool debug_ring_buffer_cb_registered_; - hidl_callback_util::HidlCallbackHandler + hidl_callback_util::HidlCallbackHandler event_cb_handler_; DISALLOW_COPY_AND_ASSIGN(WifiChip); diff --git a/wifi/1.4/default/wifi_sta_iface.cpp b/wifi/1.4/default/wifi_sta_iface.cpp index 8e1ada1032..68c989d6a6 100644 --- a/wifi/1.4/default/wifi_sta_iface.cpp +++ b/wifi/1.4/default/wifi_sta_iface.cpp @@ -113,7 +113,7 @@ Return WifiStaIface::getBackgroundScanCapabilities( } Return WifiStaIface::getValidFrequenciesForBand( - WifiBand band, getValidFrequenciesForBand_cb hidl_status_cb) { + V1_0::WifiBand band, getValidFrequenciesForBand_cb hidl_status_cb) { return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, &WifiStaIface::getValidFrequenciesForBandInternal, hidl_status_cb, band); @@ -344,7 +344,7 @@ WifiStaIface::getBackgroundScanCapabilitiesInternal() { } std::pair> -WifiStaIface::getValidFrequenciesForBandInternal(WifiBand band) { +WifiStaIface::getValidFrequenciesForBandInternal(V1_0::WifiBand band) { static_assert(sizeof(WifiChannelInMhz) == sizeof(uint32_t), "Size mismatch"); legacy_hal::wifi_error legacy_status; diff --git a/wifi/1.4/default/wifi_sta_iface.h b/wifi/1.4/default/wifi_sta_iface.h index ccf234f98e..e85e39d310 100644 --- a/wifi/1.4/default/wifi_sta_iface.h +++ b/wifi/1.4/default/wifi_sta_iface.h @@ -63,7 +63,8 @@ class WifiStaIface : public V1_4::IWifiStaIface { Return getBackgroundScanCapabilities( getBackgroundScanCapabilities_cb hidl_status_cb) override; Return getValidFrequenciesForBand( - WifiBand band, getValidFrequenciesForBand_cb hidl_status_cb) override; + V1_0::WifiBand band, + getValidFrequenciesForBand_cb hidl_status_cb) override; Return startBackgroundScan( uint32_t cmd_id, const StaBackgroundScanParameters& params, startBackgroundScan_cb hidl_status_cb) override; @@ -130,7 +131,7 @@ class WifiStaIface : public V1_4::IWifiStaIface { std::pair getBackgroundScanCapabilitiesInternal(); std::pair> - getValidFrequenciesForBandInternal(WifiBand band); + getValidFrequenciesForBandInternal(V1_0::WifiBand band); WifiStatus startBackgroundScanInternal( uint32_t cmd_id, const StaBackgroundScanParameters& params); WifiStatus stopBackgroundScanInternal(uint32_t cmd_id); diff --git a/wifi/1.4/types.hal b/wifi/1.4/types.hal index 232e26ff80..0db0c2c224 100644 --- a/wifi/1.4/types.hal +++ b/wifi/1.4/types.hal @@ -26,12 +26,35 @@ import @1.0::RttStatus; import @1.0::RttType; import @1.0::TimeSpanInPs; import @1.0::TimeStampInUs; +import @1.0::WifiBand; import @1.0::WifiChannelInfo; import @1.0::WifiChannelWidthInMhz; import @1.0::WifiInformationElement; import @1.0::WifiRateNss; import @1.0::WifiRatePreamble; +/** + * Wifi bands defined in 80211 spec. + */ +enum WifiBand : @1.0::WifiBand { + /** + * 6 GHz. + */ + BAND_6GHZ = 8, + /** + * 5 GHz no DFS + 6 GHz. + */ + BAND_5GHZ_6GHZ = 10, + /** + * 2.4 GHz + 5 GHz no DFS + 6 GHz. + */ + BAND_24GHZ_5GHZ_6GHZ = 11, + /** + * 2.4 GHz + 5 GHz with DFS + 6 GHz. + */ + BAND_24GHZ_5GHZ_WITH_DFS_6GHZ = 15 +}; + /** * Wifi Rate Preamble */ diff --git a/wifi/1.4/vts/functional/Android.bp b/wifi/1.4/vts/functional/Android.bp index c71b319acf..f3be25db55 100644 --- a/wifi/1.4/vts/functional/Android.bp +++ b/wifi/1.4/vts/functional/Android.bp @@ -21,6 +21,7 @@ cc_test { srcs: [ "VtsHalWifiV1_4TargetTest.cpp", "wifi_ap_iface_hidl_test.cpp", + "wifi_chip_hidl_test.cpp" ], static_libs: [ "VtsHalWifiV1_0TargetTestUtil", diff --git a/wifi/1.4/vts/functional/wifi_chip_hidl_test.cpp b/wifi/1.4/vts/functional/wifi_chip_hidl_test.cpp new file mode 100644 index 0000000000..8ca5214fc5 --- /dev/null +++ b/wifi/1.4/vts/functional/wifi_chip_hidl_test.cpp @@ -0,0 +1,135 @@ +/* + * Copyright (C) 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. + */ + +#include +#include + +#undef NAN // NAN is defined in bionic/libc/include/math.h:38 + +#include +#include +#include +#include +#include +#include + +#include "wifi_hidl_call_util.h" +#include "wifi_hidl_test_utils.h" + +using ::android::sp; +using ::android::hardware::hidl_string; +using ::android::hardware::hidl_vec; +using ::android::hardware::Return; +using ::android::hardware::Void; +using ::android::hardware::wifi::V1_0::IfaceType; +using ::android::hardware::wifi::V1_0::WifiDebugRingBufferStatus; +using ::android::hardware::wifi::V1_0::WifiStatus; +using ::android::hardware::wifi::V1_0::WifiStatusCode; +using ::android::hardware::wifi::V1_4::IWifiChip; +using ::android::hardware::wifi::V1_4::IWifiChipEventCallback; + +/** + * Fixture to use for all Wifi chip HIDL interface tests. + */ +class WifiChipHidlTest : public ::testing::TestWithParam { + public: + virtual void SetUp() override { + wifi_chip_ = IWifiChip::castFrom(getWifiChip(GetInstanceName())); + ASSERT_NE(nullptr, wifi_chip_.get()); + } + + virtual void TearDown() override { stopWifi(GetInstanceName()); } + + // A simple test implementation of WifiChipEventCallback. + class WifiChipEventCallback + : public ::testing::VtsHalHidlTargetCallbackBase, + public IWifiChipEventCallback { + public: + WifiChipEventCallback(){}; + + virtual ~WifiChipEventCallback() = default; + + Return onChipReconfigured(uint32_t modeId __unused) { + return Void(); + }; + + Return onChipReconfigureFailure( + const WifiStatus& status __unused) { + return Void(); + }; + + Return onIfaceAdded(IfaceType type __unused, + const hidl_string& name __unused) { + return Void(); + }; + + Return onIfaceRemoved(IfaceType type __unused, + const hidl_string& name __unused) { + return Void(); + }; + + Return onDebugRingBufferDataAvailable( + const WifiDebugRingBufferStatus& status __unused, + const hidl_vec& data __unused) { + return Void(); + }; + + Return onDebugErrorAlert(int32_t errorCode __unused, + const hidl_vec& debugData + __unused) { + return Void(); + }; + + Return onRadioModeChange( + const hidl_vec<::android::hardware::wifi::V1_2:: + IWifiChipEventCallback::RadioModeInfo>& + radioModeInfos __unused) { + return Void(); + }; + + Return onRadioModeChange_1_4( + const hidl_vec& radioModeInfos __unused) { + return Void(); + }; + }; + + protected: + sp wifi_chip_; + + private: + std::string GetInstanceName() { return GetParam(); } +}; + +/* + * registerEventCallback_1_4 + * This test case tests the registerEventCallback_1_4() API which registers + * a call back function with the hal implementation + * + * Note: it is not feasible to test the invocation of the call back function + * since event is triggered internally in the HAL implementation, and can not be + * triggered from the test case + */ +TEST_P(WifiChipHidlTest, registerEventCallback_1_4) { + sp wifiChipEventCallback = + new WifiChipEventCallback(); + const auto& status = HIDL_INVOKE(wifi_chip_, registerEventCallback_1_4, + wifiChipEventCallback); + + if (status.code != WifiStatusCode::SUCCESS) { + EXPECT_EQ(WifiStatusCode::ERROR_NOT_SUPPORTED, status.code); + return; + } +}