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 80a48f5e7b..fbb4a52bd9 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,