From da62c38e5866994c6cc99d1956ed6fe5570b036b Mon Sep 17 00:00:00 2001 From: Kumar Anand Date: Wed, 18 Nov 2020 17:17:47 -0800 Subject: [PATCH] Wifi: Chip level API to set the country code Country code is global setting across the Wifi chip and not really Wifi interface (STA or AP) specific. Framework should have the ability to set the country code on a chip level without requiring supplicant instance to be running. As long as there is at least one active interface to communicate to kernel driver, country code can be set and driver should apply the setting globally. Bug: 149936939 Test: VTS - VtsHalWifiV1_5TargetTest Change-Id: I1be5dae34b216a6152d09605d055872d5345507c --- wifi/1.5/IWifiChip.hal | 18 ++++++++++++++++++ wifi/1.5/default/wifi_chip.cpp | 13 +++++++++++++ wifi/1.5/default/wifi_chip.h | 4 +++- .../1.5/vts/functional/wifi_chip_hidl_test.cpp | 14 ++++++++++++++ 4 files changed, 48 insertions(+), 1 deletion(-) diff --git a/wifi/1.5/IWifiChip.hal b/wifi/1.5/IWifiChip.hal index 80f2ca448c..b2960cfa7a 100644 --- a/wifi/1.5/IWifiChip.hal +++ b/wifi/1.5/IWifiChip.hal @@ -216,4 +216,22 @@ interface IWifiChip extends @1.4::IWifiChip { setCoexUnsafeChannels( vec unsafeChannels, bitfield restrictions) generates (WifiStatus status); + + /** + * Set country code for this Wifi chip. + * + * Country code is global setting across the Wifi chip and not Wifi + * interface (STA or AP) specific. Legacy HAL API's for country code in + * @1.0::ISupplicantStaIface::setCountryCode & + * @1.0::IWifiApIface:setCountryCode are deprecated in favor of this + * chip level API. + * + * @param code 2 byte country code (as defined in ISO 3166) to set. + * @return status Status of the operation. + * Possible status codes: + * |WifiStatusCode.SUCCESS|, + * |WifiStatusCode.FAILURE_UNKNOWN|, + * |WifiStatusCode.FAILURE_IFACE_INVALID| + */ + setCountryCode(int8_t[2] code) generates (WifiStatus status); }; diff --git a/wifi/1.5/default/wifi_chip.cpp b/wifi/1.5/default/wifi_chip.cpp index 6dd400c899..d3a617a90a 100644 --- a/wifi/1.5/default/wifi_chip.cpp +++ b/wifi/1.5/default/wifi_chip.cpp @@ -731,6 +731,13 @@ Return WifiChip::setCoexUnsafeChannels( hidl_status_cb, unsafeChannels, restrictions); } +Return WifiChip::setCountryCode(const hidl_array& code, + setCountryCode_cb hidl_status_cb) { + return validateAndCall(this, WifiStatusCode::ERROR_WIFI_IFACE_INVALID, + &WifiChip::setCountryCodeInternal, hidl_status_cb, + code); +} + void WifiChip::invalidateAndRemoveAllIfaces() { invalidateAndClearBridgedApAll(); invalidateAndClearAll(ap_ifaces_); @@ -1478,6 +1485,12 @@ WifiStatus WifiChip::setCoexUnsafeChannelsInternal( return createWifiStatusFromLegacyError(legacy_status); } +WifiStatus WifiChip::setCountryCodeInternal(const std::array& code) { + auto legacy_status = + legacy_hal_.lock()->setCountryCode(getFirstActiveWlanIfaceName(), code); + return createWifiStatusFromLegacyError(legacy_status); +} + WifiStatus WifiChip::handleChipConfiguration( /* NONNULL */ std::unique_lock* lock, ChipModeId mode_id) { diff --git a/wifi/1.5/default/wifi_chip.h b/wifi/1.5/default/wifi_chip.h index 95c122d2b1..7d7a9b546c 100644 --- a/wifi/1.5/default/wifi_chip.h +++ b/wifi/1.5/default/wifi_chip.h @@ -178,6 +178,8 @@ class WifiChip : public V1_5::IWifiChip { const hidl_vec& unsafe_channels, hidl_bitfield restrictions, setCoexUnsafeChannels_cb hidl_status_cb) override; + Return setCountryCode(const hidl_array& code, + setCountryCode_cb _hidl_cb) override; private: void invalidateAndRemoveAllIfaces(); @@ -258,7 +260,7 @@ class WifiChip : public V1_5::IWifiChip { WifiStatus setMultiStaUseCaseInternal(MultiStaUseCase use_case); WifiStatus setCoexUnsafeChannelsInternal( std::vector unsafe_channels, uint32_t restrictions); - + WifiStatus setCountryCodeInternal(const std::array& code); WifiStatus handleChipConfiguration( std::unique_lock* lock, ChipModeId mode_id); WifiStatus registerDebugRingBufferCallback(); diff --git a/wifi/1.5/vts/functional/wifi_chip_hidl_test.cpp b/wifi/1.5/vts/functional/wifi_chip_hidl_test.cpp index a0657218f4..36a8448d04 100644 --- a/wifi/1.5/vts/functional/wifi_chip_hidl_test.cpp +++ b/wifi/1.5/vts/functional/wifi_chip_hidl_test.cpp @@ -173,6 +173,20 @@ TEST_P(WifiChipHidlTest, setCoexUnsafeChannels) { } } +/* + * SetCountryCode: + * Ensures that a call to set the country code will return with a success + * status code. + */ +TEST_P(WifiChipHidlTest, setCountryCode) { + const android::hardware::hidl_array kCountryCode{ + std::array{{0x55, 0x53}}}; + + configureChipForIfaceType(IfaceType::STA, true); + EXPECT_EQ(WifiStatusCode::SUCCESS, + HIDL_INVOKE(wifi_chip_, setCountryCode, kCountryCode).code); +} + GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(WifiChipHidlTest); INSTANTIATE_TEST_SUITE_P( PerInstance, WifiChipHidlTest,