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