Add a new AIDL API to set Multi-Link Operation mode
Bug: 268235139
Test: m android.hardware.wifi-update-api
Change-Id: Iff3baf64cb6c999eca4e1bfa4af5a41cfb5e4876
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 6d0ddaa..0e7bb86 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
@@ -82,6 +82,7 @@
void stopLoggingToDebugRingBuffer();
void triggerSubsystemRestart();
void enableStaChannelForPeerNetwork(in android.hardware.wifi.IWifiChip.ChannelCategoryMask channelCategoryEnableFlag);
+ void setMloMode(in android.hardware.wifi.IWifiChip.ChipMloMode mode);
const int NO_POWER_CAP_CONSTANT = 0x7FFFFFFF;
@Backing(type="int") @VintfStability
enum ChipCapabilityMask {
@@ -163,4 +164,11 @@
INDOOR_CHANNEL = (1 << 0) /* 1 */,
DFS_CHANNEL = (1 << 1) /* 2 */,
}
+ @Backing(type="int") @VintfStability
+ enum ChipMloMode {
+ DEFAULT = 0,
+ LOW_LATENCY = 1,
+ HIGH_THROUGHPUT = 2,
+ LOW_POWER = 3,
+ }
}
diff --git a/wifi/aidl/android/hardware/wifi/IWifiChip.aidl b/wifi/aidl/android/hardware/wifi/IWifiChip.aidl
index 8d415fd..3c89e97 100644
--- a/wifi/aidl/android/hardware/wifi/IWifiChip.aidl
+++ b/wifi/aidl/android/hardware/wifi/IWifiChip.aidl
@@ -1115,4 +1115,40 @@
* |WifiStatusCode.FAILURE_UNKNOWN|
*/
void enableStaChannelForPeerNetwork(in ChannelCategoryMask channelCategoryEnableFlag);
+
+ /**
+ * Multi-Link Operation modes.
+ */
+ @VintfStability
+ @Backing(type="int")
+ enum ChipMloMode {
+ /**
+ * Default mode for Multi-Link Operation.
+ */
+ DEFAULT = 0,
+ /**
+ * Low latency mode for Multi-link operation.
+ */
+ LOW_LATENCY = 1,
+ /**
+ * High throughput mode for Multi-link operation.
+ */
+ HIGH_THROUGHPUT = 2,
+ /**
+ * Low power mode for Multi-link operation.
+ */
+ LOW_POWER = 3,
+ }
+
+ /**
+ * Set mode for Multi-Link Operation. Various modes are defined by the enum |ChipMloMode|.
+ *
+ * @param mode MLO mode as defined by the enum |ChipMloMode|
+ * @throws ServiceSpecificException with one of the following values:
+ * |WifiStatusCode.ERROR_WIFI_IFACE_INVALID|,
+ * |WifiStatusCode.ERROR_NOT_SUPPORTED|,
+ * |WifiStatusCode.ERROR_UNKNOWN|
+ *
+ */
+ void setMloMode(in ChipMloMode mode);
}
diff --git a/wifi/aidl/default/wifi_chip.cpp b/wifi/aidl/default/wifi_chip.cpp
index 41912b5..b4c2ccd 100644
--- a/wifi/aidl/default/wifi_chip.cpp
+++ b/wifi/aidl/default/wifi_chip.cpp
@@ -26,6 +26,7 @@
#include "aidl_return_util.h"
#include "aidl_struct_util.h"
+#include "wifi_legacy_hal.h"
#include "wifi_status_util.h"
#define P2P_MGMT_DEVICE_PREFIX "p2p-dev-"
@@ -699,6 +700,11 @@
in_channelCategoryEnableFlag);
}
+ndk::ScopedAStatus WifiChip::setMloMode(const ChipMloMode in_mode) {
+ return validateAndCall(this, WifiStatusCode::ERROR_WIFI_CHIP_INVALID,
+ &WifiChip::setMloModeInternal, in_mode);
+}
+
void WifiChip::invalidateAndRemoveAllIfaces() {
invalidateAndClearBridgedApAll();
invalidateAndClearAll(ap_ifaces_);
@@ -1956,6 +1962,28 @@
return false;
}
+ndk::ScopedAStatus WifiChip::setMloModeInternal(const WifiChip::ChipMloMode in_mode) {
+ legacy_hal::wifi_mlo_mode mode;
+ switch (in_mode) {
+ case WifiChip::ChipMloMode::DEFAULT:
+ mode = legacy_hal::wifi_mlo_mode::WIFI_MLO_MODE_DEFAULT;
+ break;
+ case WifiChip::ChipMloMode::LOW_LATENCY:
+ mode = legacy_hal::wifi_mlo_mode::WIFI_MLO_MODE_LOW_LATENCY;
+ break;
+ case WifiChip::ChipMloMode::HIGH_THROUGHPUT:
+ mode = legacy_hal::wifi_mlo_mode::WIFI_MLO_MODE_HIGH_THROUGHPUT;
+ break;
+ case WifiChip::ChipMloMode::LOW_POWER:
+ mode = legacy_hal::wifi_mlo_mode::WIFI_MLO_MODE_LOW_POWER;
+ break;
+ default:
+ PLOG(ERROR) << "Error: invalid mode: " << toString(in_mode);
+ return createWifiStatus(WifiStatusCode::ERROR_INVALID_ARGS);
+ }
+ return createWifiStatusFromLegacyError(legacy_hal_.lock()->setMloMode(mode));
+}
+
} // namespace wifi
} // namespace hardware
} // namespace android
diff --git a/wifi/aidl/default/wifi_chip.h b/wifi/aidl/default/wifi_chip.h
index b552c33..ff4ee9c 100644
--- a/wifi/aidl/default/wifi_chip.h
+++ b/wifi/aidl/default/wifi_chip.h
@@ -150,6 +150,7 @@
ndk::ScopedAStatus enableStaChannelForPeerNetwork(
ChannelCategoryMask in_channelCategoryEnableFlag) override;
binder_status_t dump(int fd, const char** args, uint32_t numArgs) override;
+ ndk::ScopedAStatus setMloMode(const ChipMloMode in_mode) override;
private:
void invalidateAndRemoveAllIfaces();
@@ -260,6 +261,7 @@
std::pair<WifiRadioCombinationMatrix, ndk::ScopedAStatus>
getSupportedRadioCombinationsMatrixInternal();
std::pair<WifiChipCapabilities, ndk::ScopedAStatus> getWifiChipCapabilitiesInternal();
+ ndk::ScopedAStatus setMloModeInternal(const ChipMloMode in_mode);
void setWeakPtr(std::weak_ptr<WifiChip> ptr);
int32_t chip_id_;
diff --git a/wifi/aidl/default/wifi_legacy_hal.cpp b/wifi/aidl/default/wifi_legacy_hal.cpp
index 6436fb7..4e8321e 100644
--- a/wifi/aidl/default/wifi_legacy_hal.cpp
+++ b/wifi/aidl/default/wifi_legacy_hal.cpp
@@ -1869,6 +1869,10 @@
channelCategoryEnableFlag);
}
+wifi_error WifiLegacyHal::setMloMode(wifi_mlo_mode mode) {
+ return global_func_table_.wifi_set_mlo_mode(global_handle_, mode);
+}
+
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 468d8d7..6db0324 100644
--- a/wifi/aidl/default/wifi_legacy_hal.h
+++ b/wifi/aidl/default/wifi_legacy_hal.h
@@ -312,6 +312,7 @@
using ::WIFI_LOGGER_PACKET_FATE_SUPPORTED;
using ::WIFI_LOGGER_POWER_EVENT_SUPPORTED;
using ::WIFI_LOGGER_WAKE_LOCK_SUPPORTED;
+using ::wifi_mlo_mode;
using ::WIFI_MOTION_EXPECTED;
using ::WIFI_MOTION_NOT_EXPECTED;
using ::wifi_motion_pattern;
@@ -770,6 +771,7 @@
const CachedScanResultsCallbackHandlers& handler);
std::pair<wifi_error, wifi_chip_capabilities> getWifiChipCapabilities();
wifi_error enableStaChannelForPeerNetwork(uint32_t channelCategoryEnableFlag);
+ wifi_error setMloMode(wifi_mlo_mode mode);
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 42743df..77d1cb5 100644
--- a/wifi/aidl/default/wifi_legacy_hal_stubs.cpp
+++ b/wifi/aidl/default/wifi_legacy_hal_stubs.cpp
@@ -177,6 +177,7 @@
populateStubFor(&hal_fn->wifi_nan_suspend_request);
populateStubFor(&hal_fn->wifi_nan_resume_request);
populateStubFor(&hal_fn->wifi_set_scan_mode);
+ populateStubFor(&hal_fn->wifi_set_mlo_mode);
return true;
}