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..48dc8e0805 --- /dev/null +++ b/wifi/aidl/aidl_api/android.hardware.wifi/current/android/hardware/wifi/WifiChipCapabilities.aidl @@ -0,0 +1,39 @@ +/* + * 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; + int maxConcurrentTdlsSessionCount; +} 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..f65d49ac28 --- /dev/null +++ b/wifi/aidl/android/hardware/wifi/WifiChipCapabilities.aidl @@ -0,0 +1,37 @@ +/* + * 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; + /** + * Maximum number of concurrent TDLS sessions that can be enabled + * by framework via ISupplicantStaIface#initiateTdlsSetup(). + */ + int maxConcurrentTdlsSessionCount; +} diff --git a/wifi/aidl/default/aidl_struct_util.cpp b/wifi/aidl/default/aidl_struct_util.cpp index 07612b65c5..ec8b3968f2 100644 --- a/wifi/aidl/default/aidl_struct_util.cpp +++ b/wifi/aidl/default/aidl_struct_util.cpp @@ -2768,6 +2768,15 @@ 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; + aidl_chip_capabilities.maxConcurrentTdlsSessionCount = + legacy_chip_capabilities.max_concurrent_tdls_session_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; }