Merge "[wpa_supplicant] Cumulative patch from 9fde14607"
diff --git a/wpa_supplicant/hidl/1.3/sta_iface.cpp b/wpa_supplicant/hidl/1.3/sta_iface.cpp
index e82305d..f1c4fbe 100644
--- a/wpa_supplicant/hidl/1.3/sta_iface.cpp
+++ b/wpa_supplicant/hidl/1.3/sta_iface.cpp
@@ -29,7 +29,9 @@
 namespace {
 using android::hardware::wifi::supplicant::V1_0::SupplicantStatus;
 using android::hardware::wifi::supplicant::V1_0::SupplicantStatusCode;
-using android::hardware::wifi::supplicant::V1_0::ISupplicantStaIface;
+using android::hardware::wifi::supplicant::V1_3::ISupplicantStaIface;
+using android::hardware::wifi::supplicant::V1_3::ConnectionCapabilities;
+using android::hardware::wifi::supplicant::V1_3::WifiTechnology;
 using android::hardware::wifi::supplicant::V1_3::implementation::HidlManager;
 
 constexpr uint32_t kMaxAnqpElems = 100;
@@ -612,6 +614,14 @@
 	return {{SupplicantStatusCode::SUCCESS, ""}, network};
 }
 
+Return<void> StaIface::getConnectionCapabilities(
+    getConnectionCapabilities_cb _hidl_cb)
+{
+	return validateAndCall(
+	    this, SupplicantStatusCode::FAILURE_UNKNOWN,
+	    &StaIface::getConnectionCapabilitiesInternal, _hidl_cb);
+}
+
 SupplicantStatus StaIface::removeNetworkInternal(SupplicantNetworkId id)
 {
 	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
@@ -1308,6 +1318,28 @@
 #endif
 }
 
+std::pair<SupplicantStatus, ConnectionCapabilities>
+StaIface::getConnectionCapabilitiesInternal()
+{
+    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};
+}
+
 /**
  * Retrieve the underlying |wpa_supplicant| struct
  * pointer for this iface.
diff --git a/wpa_supplicant/hidl/1.3/sta_iface.h b/wpa_supplicant/hidl/1.3/sta_iface.h
index b425bec..47fa0b4 100644
--- a/wpa_supplicant/hidl/1.3/sta_iface.h
+++ b/wpa_supplicant/hidl/1.3/sta_iface.h
@@ -182,6 +182,8 @@
 			uint32_t own_bootstrap_id,
 			startDppConfiguratorInitiator_cb _hidl_cb) override;
 	Return<void> stopDppInitiator(stopDppInitiator_cb _hidl_cb) override;
+	Return<void> getConnectionCapabilities(
+	    getConnectionCapabilities_cb _hidl_cb) override;
 
 private:
 	// Corresponding worker functions for the HIDL methods.
@@ -265,7 +267,7 @@
 	SupplicantStatus startDppEnrolleeInitiatorInternal(uint32_t peer_bootstrap_id,
 			uint32_t own_bootstrap_id);
 	SupplicantStatus stopDppInitiatorInternal();
-
+	std::pair<SupplicantStatus, ConnectionCapabilities> getConnectionCapabilitiesInternal();
 
 	struct wpa_supplicant* retrieveIfacePtr();