MBO-OCE feature support (phase 1)
1. Implementation of HAL API to get wpa driver capabilities
to framework.
2. Implementation of HAL API to update cellular data status.
Bug: 139474288
Test: Manual
Test: VTS test
Change-Id: Ie6929f0b7ee09a91fe0345e1b4910eab24d7d378
diff --git a/wpa_supplicant/android.config b/wpa_supplicant/android.config
index ad3af40..cf8b8bb 100644
--- a/wpa_supplicant/android.config
+++ b/wpa_supplicant/android.config
@@ -503,7 +503,7 @@
#CONFIG_FST=y
# Support Multi Band Operation
-#CONFIG_MBO=y
+CONFIG_MBO=y
# Fast Initial Link Setup (FILS) (IEEE 802.11ai)
#CONFIG_FILS=y
diff --git a/wpa_supplicant/hidl/1.3/sta_iface.cpp b/wpa_supplicant/hidl/1.3/sta_iface.cpp
index f1c4fbe..c9e5305 100644
--- a/wpa_supplicant/hidl/1.3/sta_iface.cpp
+++ b/wpa_supplicant/hidl/1.3/sta_iface.cpp
@@ -586,6 +586,22 @@
&StaIface::stopDppInitiatorInternal, _hidl_cb);
}
+Return<void> StaIface::getWpaDriverCapabilities(
+ getWpaDriverCapabilities_cb _hidl_cb)
+{
+ return validateAndCall(
+ this, SupplicantStatusCode::FAILURE_UNKNOWN,
+ &StaIface::getWpaDriverCapabilitiesInternal, _hidl_cb);
+}
+
+Return<void> StaIface::setMboCellularDataStatus(bool available,
+ setMboCellularDataStatus_cb _hidl_cb)
+{
+ return validateAndCall(
+ this, SupplicantStatusCode::FAILURE_UNKNOWN,
+ &StaIface::setMboCellularDataStatusInternal, _hidl_cb, available);
+}
+
std::pair<SupplicantStatus, std::string> StaIface::getNameInternal()
{
return {{SupplicantStatusCode::SUCCESS, ""}, ifname_};
@@ -1321,23 +1337,63 @@
std::pair<SupplicantStatus, ConnectionCapabilities>
StaIface::getConnectionCapabilitiesInternal()
{
- struct wpa_supplicant *wpa_s = retrieveIfacePtr();
- struct ConnectionCapabilities capa;
+ struct wpa_supplicant *wpa_s = retrieveIfacePtr();
+ struct ConnectionCapabilities capa;
- if (wpa_s->connection_set) {
- if (wpa_s->connection_he) {
- capa.technology = WifiTechnology::HE;
- } else if (wpa_s->connection_vht) {
- capa.technology = WifiTechnology::VHT;
- } else if (wpa_s->connection_ht) {
- capa.technology = WifiTechnology::HT;
- } else {
- capa.technology = WifiTechnology::LEGACY;
- }
- } else {
- capa.technology = WifiTechnology::UNKNOWN;
- }
- return {{SupplicantStatusCode::SUCCESS, ""}, capa};
+ if (wpa_s->connection_set) {
+ if (wpa_s->connection_he) {
+ capa.technology = WifiTechnology::HE;
+ } else if (wpa_s->connection_vht) {
+ capa.technology = WifiTechnology::VHT;
+ } else if (wpa_s->connection_ht) {
+ capa.technology = WifiTechnology::HT;
+ } else {
+ capa.technology = WifiTechnology::LEGACY;
+ }
+ } else {
+ capa.technology = WifiTechnology::UNKNOWN;
+ }
+ return {{SupplicantStatusCode::SUCCESS, ""}, capa};
+}
+
+std::pair<SupplicantStatus, uint32_t>
+StaIface::getWpaDriverCapabilitiesInternal()
+{
+ struct wpa_supplicant *wpa_s = retrieveIfacePtr();
+ uint32_t mask = 0;
+
+#ifdef CONFIG_MBO
+ /* MBO has no capability flags. It's mainly legacy 802.11v BSS
+ * transition + Cellular steering. 11v is a default feature in
+ * supplicant. And cellular steering is handled in framework.
+ */
+ mask |= WpaDriverCapabilitiesMask::MBO;
+ if (wpa_s->enable_oce & OCE_STA) {
+ mask |= WpaDriverCapabilitiesMask::OCE;
+ }
+#endif
+
+ wpa_printf(MSG_DEBUG, "Driver capability mask: 0x%x", mask);
+
+ return {{SupplicantStatusCode::SUCCESS, ""}, mask};
+}
+
+SupplicantStatus StaIface::setMboCellularDataStatusInternal(bool available)
+{
+#ifdef CONFIG_MBO
+ struct wpa_supplicant *wpa_s = retrieveIfacePtr();
+ enum mbo_cellular_capa mbo_cell_capa;
+
+ if (available) {
+ mbo_cell_capa = MBO_CELL_CAPA_AVAILABLE;
+ } else {
+ mbo_cell_capa = MBO_CELL_CAPA_NOT_AVAILABLE;
+ }
+ wpas_mbo_update_cell_capa(wpa_s, mbo_cell_capa);
+ return {SupplicantStatusCode::SUCCESS, ""};
+#else
+ return {SupplicantStatusCode::FAILURE_UNKNOWN, ""};
+#endif
}
/**
diff --git a/wpa_supplicant/hidl/1.3/sta_iface.h b/wpa_supplicant/hidl/1.3/sta_iface.h
index 47fa0b4..23d8c38 100644
--- a/wpa_supplicant/hidl/1.3/sta_iface.h
+++ b/wpa_supplicant/hidl/1.3/sta_iface.h
@@ -184,6 +184,10 @@
Return<void> stopDppInitiator(stopDppInitiator_cb _hidl_cb) override;
Return<void> getConnectionCapabilities(
getConnectionCapabilities_cb _hidl_cb) override;
+ Return<void> getWpaDriverCapabilities(
+ getWpaDriverCapabilities_cb _hidl_cb) override;
+ Return<void> setMboCellularDataStatus(bool available,
+ setMboCellularDataStatus_cb _hidl_cb) override;
private:
// Corresponding worker functions for the HIDL methods.
@@ -268,6 +272,8 @@
uint32_t own_bootstrap_id);
SupplicantStatus stopDppInitiatorInternal();
std::pair<SupplicantStatus, ConnectionCapabilities> getConnectionCapabilitiesInternal();
+ std::pair<SupplicantStatus, uint32_t> getWpaDriverCapabilitiesInternal();
+ SupplicantStatus setMboCellularDataStatusInternal(bool available);
struct wpa_supplicant* retrieveIfacePtr();
diff --git a/wpa_supplicant/wpa_supplicant_template.conf b/wpa_supplicant/wpa_supplicant_template.conf
index f55227f..fce7e5e 100644
--- a/wpa_supplicant/wpa_supplicant_template.conf
+++ b/wpa_supplicant/wpa_supplicant_template.conf
@@ -5,3 +5,4 @@
fast_reauth=1
pmf=1
p2p_add_cli_chan=1
+oce=1