From 766953f20d340572af6b0e0c802f02026f10e2c1 Mon Sep 17 00:00:00 2001 From: Mahesh KKV Date: Thu, 6 Oct 2022 12:10:11 -0700 Subject: [PATCH 1/4] wifi: Add AIDL support for getWifiChipCapabilities() Define a new AIDL API to get capabilities from the vendor chip. Bug: 231497844 Test: m android.hardware.wifi-update-api Change-Id: I3c1cfce4df2101125a628f230b938b3be0f80311 --- .../android/hardware/wifi/IWifiChip.aidl | 1 + .../hardware/wifi/WifiChipCapabilities.aidl | 38 +++++++++++++++++++ .../aidl/android/hardware/wifi/IWifiChip.aidl | 13 +++++++ .../hardware/wifi/WifiChipCapabilities.aidl | 32 ++++++++++++++++ 4 files changed, 84 insertions(+) create mode 100644 wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/WifiChipCapabilities.aidl create mode 100644 wifi/aidl/android/hardware/wifi/WifiChipCapabilities.aidl diff --git a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/IWifiChip.aidl b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/IWifiChip.aidl index 647891f7cb..f800e8f6aa 100644 --- a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/IWifiChip.aidl +++ b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/IWifiChip.aidl @@ -59,6 +59,7 @@ interface IWifiChip { @PropagateAllowBlocking android.hardware.wifi.IWifiStaIface getStaIface(in String ifname); String[] getStaIfaceNames(); android.hardware.wifi.WifiRadioCombinationMatrix getSupportedRadioCombinationsMatrix(); + android.hardware.wifi.WifiChipCapabilities getWifiChipCapabilities(); android.hardware.wifi.WifiUsableChannel[] getUsableChannels(in android.hardware.wifi.WifiBand band, in android.hardware.wifi.WifiIfaceMode ifaceModeMask, in android.hardware.wifi.IWifiChip.UsableChannelFilter filterMask); void registerEventCallback(in android.hardware.wifi.IWifiChipEventCallback callback); void removeApIface(in String ifname); diff --git a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/WifiChipCapabilities.aidl b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/WifiChipCapabilities.aidl new file mode 100644 index 0000000000..ab26fb55f5 --- /dev/null +++ b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/WifiChipCapabilities.aidl @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2022 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. + */ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL file. Do not edit it manually. There are +// two cases: +// 1). this is a frozen version file - do not edit this in any case. +// 2). this is a 'current' file. If you make a backwards compatible change to +// the interface (from the latest frozen version), the build system will +// prompt you to update this file with `m -update-api`. +// +// You must not make a backward incompatible change to any AIDL file built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.wifi; +@VintfStability +parcelable WifiChipCapabilities { + int maxMloLinkCount; +} diff --git a/wifi/aidl/android/hardware/wifi/IWifiChip.aidl b/wifi/aidl/android/hardware/wifi/IWifiChip.aidl index fe9a6f399b..64692aff36 100644 --- a/wifi/aidl/android/hardware/wifi/IWifiChip.aidl +++ b/wifi/aidl/android/hardware/wifi/IWifiChip.aidl @@ -25,6 +25,7 @@ import android.hardware.wifi.IWifiStaIface; import android.hardware.wifi.IfaceConcurrencyType; import android.hardware.wifi.IfaceType; import android.hardware.wifi.WifiBand; +import android.hardware.wifi.WifiChipCapabilities; import android.hardware.wifi.WifiDebugHostWakeReasonStats; import android.hardware.wifi.WifiDebugRingBufferStatus; import android.hardware.wifi.WifiDebugRingBufferVerboseLevel; @@ -784,6 +785,18 @@ interface IWifiChip { */ WifiRadioCombinationMatrix getSupportedRadioCombinationsMatrix(); + /** + * Get capabilities supported by this chip. + * + * @return Chip capabilities represented by |WifiChipCapabilities|. + * @throws ServiceSpecificException with one of the following values: + * |WifiStatusCode.ERROR_WIFI_CHIP_INVALID|, + * |WifiStatusCode.ERROR_NOT_SUPPORTED|, + * |WifiStatusCode.FAILURE_UNKNOWN| + * + */ + WifiChipCapabilities getWifiChipCapabilities(); + /** * Retrieve a list of usable Wifi channels for the specified band & * operational modes. diff --git a/wifi/aidl/android/hardware/wifi/WifiChipCapabilities.aidl b/wifi/aidl/android/hardware/wifi/WifiChipCapabilities.aidl new file mode 100644 index 0000000000..1d268255ae --- /dev/null +++ b/wifi/aidl/android/hardware/wifi/WifiChipCapabilities.aidl @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2022 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; + +/** + * WifiChipCapabilities captures various Wifi chip capability params. + */ +@VintfStability +parcelable WifiChipCapabilities { + /** + * Maximum number of links used in Multi-Link Operation. The maximum + * number of links used for MLO can be different from the number of + * radios supported by the chip. + * + * This is a static configuration of the chip. + */ + int maxMloLinkCount; +} From c84d3770eb57f81a91379ed4a42233e6edd2f4b5 Mon Sep 17 00:00:00 2001 From: Mahesh KKV Date: Fri, 2 Dec 2022 16:53:28 -0800 Subject: [PATCH 2/4] wifi: Add getWifiChipCapabilities() in shim layer Bug: 231497844 Test: hardware/interfaces/wifi/aidl/default/tests/runtests.sh Change-Id: Iba4f749999e9a2aa25455e09440a961188f049f9 --- wifi/aidl/default/aidl_struct_util.cpp | 7 ++++++ wifi/aidl/default/aidl_struct_util.h | 3 +++ wifi/aidl/default/wifi_chip.cpp | 25 +++++++++++++++++++++ wifi/aidl/default/wifi_chip.h | 2 ++ wifi/aidl/default/wifi_legacy_hal.cpp | 7 ++++++ wifi/aidl/default/wifi_legacy_hal.h | 2 ++ wifi/aidl/default/wifi_legacy_hal_stubs.cpp | 1 + 7 files changed, 47 insertions(+) diff --git a/wifi/aidl/default/aidl_struct_util.cpp b/wifi/aidl/default/aidl_struct_util.cpp index 07612b65c5..1ed2e17657 100644 --- a/wifi/aidl/default/aidl_struct_util.cpp +++ b/wifi/aidl/default/aidl_struct_util.cpp @@ -2768,6 +2768,13 @@ bool convertLegacyRadioCombinationsMatrixToAidl( return true; } +bool convertLegacyWifiChipCapabilitiesToAidl( + const legacy_hal::wifi_chip_capabilities& legacy_chip_capabilities, + WifiChipCapabilities& aidl_chip_capabilities) { + aidl_chip_capabilities.maxMloLinkCount = legacy_chip_capabilities.max_mlo_link_count; + return true; +} + } // namespace aidl_struct_util } // namespace wifi } // namespace hardware diff --git a/wifi/aidl/default/aidl_struct_util.h b/wifi/aidl/default/aidl_struct_util.h index 4ebfc10787..d8e1fd48aa 100644 --- a/wifi/aidl/default/aidl_struct_util.h +++ b/wifi/aidl/default/aidl_struct_util.h @@ -171,6 +171,9 @@ bool convertLegacyPeerInfoStatsToAidl(const legacy_hal::WifiPeerInfo& legacy_pee StaPeerInfo* aidl_peer_info_stats); bool convertLegacyWifiRateInfoToAidl(const legacy_hal::wifi_rate& legacy_rate, WifiRateInfo* aidl_rate); +bool convertLegacyWifiChipCapabilitiesToAidl( + const legacy_hal::wifi_chip_capabilities& legacy_chip_capabilities, + WifiChipCapabilities& aidl_chip_capabilities); } // namespace aidl_struct_util } // namespace wifi } // namespace hardware diff --git a/wifi/aidl/default/wifi_chip.cpp b/wifi/aidl/default/wifi_chip.cpp index 076f351448..406169912f 100644 --- a/wifi/aidl/default/wifi_chip.cpp +++ b/wifi/aidl/default/wifi_chip.cpp @@ -680,6 +680,11 @@ ndk::ScopedAStatus WifiChip::getSupportedRadioCombinationsMatrix( &WifiChip::getSupportedRadioCombinationsMatrixInternal, _aidl_return); } +ndk::ScopedAStatus WifiChip::getWifiChipCapabilities(WifiChipCapabilities* _aidl_return) { + return validateAndCall(this, WifiStatusCode::ERROR_WIFI_CHIP_INVALID, + &WifiChip::getWifiChipCapabilitiesInternal, _aidl_return); +} + void WifiChip::invalidateAndRemoveAllIfaces() { invalidateAndClearBridgedApAll(); invalidateAndClearAll(ap_ifaces_); @@ -1403,6 +1408,26 @@ WifiChip::getSupportedRadioCombinationsMatrixInternal() { return {aidl_matrix, ndk::ScopedAStatus::ok()}; } +std::pair WifiChip::getWifiChipCapabilitiesInternal() { + legacy_hal::wifi_error legacy_status; + legacy_hal::wifi_chip_capabilities legacy_chip_capabilities; + std::tie(legacy_status, legacy_chip_capabilities) = + legacy_hal_.lock()->getWifiChipCapabilities(); + if (legacy_status != legacy_hal::WIFI_SUCCESS) { + LOG(ERROR) << "Failed to get chip capabilities from legacy HAL: " + << legacyErrorToString(legacy_status); + return {WifiChipCapabilities(), createWifiStatusFromLegacyError(legacy_status)}; + } + WifiChipCapabilities aidl_chip_capabilities; + if (!aidl_struct_util::convertLegacyWifiChipCapabilitiesToAidl(legacy_chip_capabilities, + aidl_chip_capabilities)) { + LOG(ERROR) << "Failed convertLegacyWifiChipCapabilitiesToAidl() "; + return {WifiChipCapabilities(), createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS)}; + } + + return {aidl_chip_capabilities, ndk::ScopedAStatus::ok()}; +} + ndk::ScopedAStatus WifiChip::triggerSubsystemRestartInternal() { auto legacy_status = legacy_hal_.lock()->triggerSubsystemRestart(); return createWifiStatusFromLegacyError(legacy_status); diff --git a/wifi/aidl/default/wifi_chip.h b/wifi/aidl/default/wifi_chip.h index 59eaa4a58c..7b04e851f8 100644 --- a/wifi/aidl/default/wifi_chip.h +++ b/wifi/aidl/default/wifi_chip.h @@ -144,6 +144,7 @@ class WifiChip : public BnWifiChip { ndk::ScopedAStatus triggerSubsystemRestart() override; ndk::ScopedAStatus getSupportedRadioCombinationsMatrix( WifiRadioCombinationMatrix* _aidl_return) override; + ndk::ScopedAStatus getWifiChipCapabilities(WifiChipCapabilities* _aidl_return) override; binder_status_t dump(int fd, const char** args, uint32_t numArgs) override; private: @@ -250,6 +251,7 @@ class WifiChip : public BnWifiChip { ndk::ScopedAStatus triggerSubsystemRestartInternal(); std::pair getSupportedRadioCombinationsMatrixInternal(); + std::pair getWifiChipCapabilitiesInternal(); void setWeakPtr(std::weak_ptr ptr); int32_t chip_id_; diff --git a/wifi/aidl/default/wifi_legacy_hal.cpp b/wifi/aidl/default/wifi_legacy_hal.cpp index 43e73cae9f..e4883d19f3 100644 --- a/wifi/aidl/default/wifi_legacy_hal.cpp +++ b/wifi/aidl/default/wifi_legacy_hal.cpp @@ -1609,6 +1609,13 @@ wifi_error WifiLegacyHal::getWifiCachedScanResults( return status; } +std::pair WifiLegacyHal::getWifiChipCapabilities() { + wifi_chip_capabilities chip_capabilities; + wifi_error status = + global_func_table_.wifi_get_chip_capabilities(global_handle_, &chip_capabilities); + return {status, chip_capabilities}; +} + void WifiLegacyHal::invalidate() { global_handle_ = nullptr; iface_name_to_handle_.clear(); diff --git a/wifi/aidl/default/wifi_legacy_hal.h b/wifi/aidl/default/wifi_legacy_hal.h index cd8c0b1136..33ed359baa 100644 --- a/wifi/aidl/default/wifi_legacy_hal.h +++ b/wifi/aidl/default/wifi_legacy_hal.h @@ -232,6 +232,7 @@ using ::WIFI_CHAN_WIDTH_INVALID; using ::wifi_channel_info; using ::wifi_channel_stat; using ::wifi_channel_width; +using ::wifi_chip_capabilities; using ::wifi_coex_restriction; using ::wifi_coex_unsafe_channel; using ::WIFI_DUAL_STA_NON_TRANSIENT_UNBIASED; @@ -693,6 +694,7 @@ class WifiLegacyHal { wifi_error enableWifiTxPowerLimits(const std::string& iface_name, bool enable); wifi_error getWifiCachedScanResults(const std::string& iface_name, const CachedScanResultsCallbackHandlers& handler); + std::pair getWifiChipCapabilities(); private: // Retrieve interface handles for all the available interfaces. diff --git a/wifi/aidl/default/wifi_legacy_hal_stubs.cpp b/wifi/aidl/default/wifi_legacy_hal_stubs.cpp index cff7f6977b..777789442d 100644 --- a/wifi/aidl/default/wifi_legacy_hal_stubs.cpp +++ b/wifi/aidl/default/wifi_legacy_hal_stubs.cpp @@ -167,6 +167,7 @@ bool initHalFuncTableWithStubs(wifi_hal_fn* hal_fn) { populateStubFor(&hal_fn->wifi_chre_register_handler); populateStubFor(&hal_fn->wifi_enable_tx_power_limits); populateStubFor(&hal_fn->wifi_get_cached_scan_results); + populateStubFor(&hal_fn->wifi_get_chip_capabilities); return true; } From dbd11bdd4123b84382a0c6efdc721772a4c954a9 Mon Sep 17 00:00:00 2001 From: Sunil Ravi Date: Mon, 12 Dec 2022 03:53:11 +0000 Subject: [PATCH 3/4] wifi: AIDL support to get concurrent TDLS session count Added a new field in chip capabilities to get the maximum number of concurrent TDLS sessions supported by the chip Bug: 240247868 Test: Manual - STA connect/disconnect Test: m android.hardware.wifi-update-api Change-Id: Ie2a4129241f40fc9eba28105b8ea3c06b27a8492 --- .../current/android/hardware/wifi/WifiChipCapabilities.aidl | 1 + wifi/aidl/android/hardware/wifi/WifiChipCapabilities.aidl | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/WifiChipCapabilities.aidl b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/WifiChipCapabilities.aidl index ab26fb55f5..48dc8e0805 100644 --- a/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/WifiChipCapabilities.aidl +++ b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/WifiChipCapabilities.aidl @@ -35,4 +35,5 @@ package android.hardware.wifi; @VintfStability parcelable WifiChipCapabilities { int maxMloLinkCount; + int maxConcurrentTdlsSessionCount; } diff --git a/wifi/aidl/android/hardware/wifi/WifiChipCapabilities.aidl b/wifi/aidl/android/hardware/wifi/WifiChipCapabilities.aidl index 1d268255ae..f65d49ac28 100644 --- a/wifi/aidl/android/hardware/wifi/WifiChipCapabilities.aidl +++ b/wifi/aidl/android/hardware/wifi/WifiChipCapabilities.aidl @@ -29,4 +29,9 @@ parcelable WifiChipCapabilities { * This is a static configuration of the chip. */ int maxMloLinkCount; + /** + * Maximum number of concurrent TDLS sessions that can be enabled + * by framework via ISupplicantStaIface#initiateTdlsSetup(). + */ + int maxConcurrentTdlsSessionCount; } From 4855621726bc65c5a16b55ac14fd7706dade3aaf Mon Sep 17 00:00:00 2001 From: Sunil Ravi Date: Mon, 12 Dec 2022 04:17:04 +0000 Subject: [PATCH 4/4] wifi: Legacy HAL support to get concurrent TDLS session count Added a new field in chip capabilities to get the maximum number of concurrent TDLS sessions supported by the chip Bug: 240247868 Test: Manual - STA connect/disconnect Change-Id: I62fcd2d4a562b088cdeb4b04f72cfe55ed61241c --- wifi/aidl/default/aidl_struct_util.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/wifi/aidl/default/aidl_struct_util.cpp b/wifi/aidl/default/aidl_struct_util.cpp index 1ed2e17657..ec8b3968f2 100644 --- a/wifi/aidl/default/aidl_struct_util.cpp +++ b/wifi/aidl/default/aidl_struct_util.cpp @@ -2772,6 +2772,8 @@ bool convertLegacyWifiChipCapabilitiesToAidl( const legacy_hal::wifi_chip_capabilities& legacy_chip_capabilities, WifiChipCapabilities& aidl_chip_capabilities) { aidl_chip_capabilities.maxMloLinkCount = legacy_chip_capabilities.max_mlo_link_count; + aidl_chip_capabilities.maxConcurrentTdlsSessionCount = + legacy_chip_capabilities.max_concurrent_tdls_session_count; return true; }