wifi: implement transition disable callback API
Bug: 160643860
Test: atest VtsHalWifiSupplicantV1_4TargetTest
Change-Id: I802addf9b8bcbfa7dc9dfe4528ca38fad80a806a
diff --git a/wpa_supplicant/hidl/1.4/hidl.cpp b/wpa_supplicant/hidl/1.4/hidl.cpp
index c664e15..0bf03d6 100644
--- a/wpa_supplicant/hidl/1.4/hidl.cpp
+++ b/wpa_supplicant/hidl/1.4/hidl.cpp
@@ -876,3 +876,17 @@
hidl_manager->notifyBssTmStatus(wpa_s);
}
+
+void wpas_hidl_notify_transition_disable(struct wpa_supplicant *wpa_s,
+ struct wpa_ssid *ssid,
+ u8 bitmap)
+{
+ if (!wpa_s || !ssid)
+ return;
+
+ HidlManager *hidl_manager = HidlManager::getInstance();
+ if (!hidl_manager)
+ return;
+
+ hidl_manager->notifyTransitionDisable(wpa_s, ssid, bitmap);
+}
diff --git a/wpa_supplicant/hidl/1.4/hidl.h b/wpa_supplicant/hidl/1.4/hidl.h
index bf03bf9..8ab85a9 100644
--- a/wpa_supplicant/hidl/1.4/hidl.h
+++ b/wpa_supplicant/hidl/1.4/hidl.h
@@ -121,6 +121,8 @@
void wpas_hidl_notify_pmk_cache_added(
struct wpa_supplicant *wpas, struct rsn_pmksa_cache_entry *pmksa_entry);
void wpas_hidl_notify_bss_tm_status(struct wpa_supplicant *wpa_s);
+ void wpas_hidl_notify_transition_disable(
+ struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid, u8 bitmap);
#else // CONFIG_CTRL_IFACE_HIDL
static inline int wpas_hidl_register_interface(struct wpa_supplicant *wpa_s)
{
@@ -263,6 +265,10 @@
{}
void wpas_hidl_notify_bss_tm_status(struct wpa_supplicant *wpa_s)
{}
+static void wpas_hidl_notify_transition_disable(struct wpa_supplicant *wpa_s,
+ struct wpa_ssid *ssid,
+ u8 bitmap)
+{}
#endif // CONFIG_CTRL_IFACE_HIDL
#ifdef _cplusplus
diff --git a/wpa_supplicant/hidl/1.4/hidl_manager.cpp b/wpa_supplicant/hidl/1.4/hidl_manager.cpp
index b44f0fd..9bb451a 100644
--- a/wpa_supplicant/hidl/1.4/hidl_manager.cpp
+++ b/wpa_supplicant/hidl/1.4/hidl_manager.cpp
@@ -323,6 +323,38 @@
}
}
+template <class CallbackTypeBase, class CallbackTypeDerived>
+void callWithEachNetworkCallbackDerived(
+ const std::string &ifname, int network_id,
+ const std::function<
+ android::hardware::Return<void>(android::sp<CallbackTypeDerived>)> &method,
+ const std::map<
+ const std::string, std::vector<android::sp<CallbackTypeBase>>>
+ &callbacks_map)
+{
+ if (ifname.empty())
+ return;
+
+ // Generate the key to be used to lookup the network.
+ const std::string network_key =
+ getNetworkObjectMapKey(ifname, network_id);
+ auto network_callback_map_iter = callbacks_map.find(network_key);
+ if (network_callback_map_iter == callbacks_map.end())
+ return;
+ const auto &network_callback_list = network_callback_map_iter->second;
+ for (const auto &callback : network_callback_list) {
+ android::sp<CallbackTypeDerived> callback_derived =
+ CallbackTypeDerived::castFrom(callback);
+ if (callback_derived == nullptr)
+ continue;
+ if (!method(callback_derived).isOk()) {
+ wpa_printf(
+ MSG_ERROR,
+ "Failed to invoke HIDL network callback");
+ }
+ }
+}
+
int parseGsmAuthNetworkRequest(
const std::string ¶ms_str,
std::vector<hidl_array<uint8_t, kGsmRandLenBytes>> *out_rands)
@@ -1737,6 +1769,56 @@
#endif
}
+uint32_t setTransitionDisableFlagsMask(u8 bitmap)
+{
+ uint32_t flags = 0;
+
+ if (bitmap & TRANSITION_DISABLE_WPA3_PERSONAL) {
+ flags |= V1_4::ISupplicantStaNetworkCallback::
+ TransitionDisableIndication::
+ USE_WPA3_PERSONAL;
+ bitmap &= ~TRANSITION_DISABLE_WPA3_PERSONAL;
+ }
+ if (bitmap & TRANSITION_DISABLE_SAE_PK) {
+ flags |= V1_4::ISupplicantStaNetworkCallback::
+ TransitionDisableIndication::
+ USE_SAE_PK;
+ bitmap &= ~TRANSITION_DISABLE_SAE_PK;
+ }
+ if (bitmap & TRANSITION_DISABLE_WPA3_ENTERPRISE) {
+ flags |= V1_4::ISupplicantStaNetworkCallback::
+ TransitionDisableIndication::
+ USE_WPA3_ENTERPRISE;
+ bitmap &= ~TRANSITION_DISABLE_WPA3_ENTERPRISE;
+ }
+ if (bitmap & TRANSITION_DISABLE_ENHANCED_OPEN) {
+ flags |= V1_4::ISupplicantStaNetworkCallback::
+ TransitionDisableIndication::
+ USE_ENHANCED_OPEN;
+ bitmap &= ~TRANSITION_DISABLE_ENHANCED_OPEN;
+ }
+
+ if (bitmap != 0) {
+ wpa_printf(MSG_WARNING, "Unhandled transition disable bit: 0x%x", bitmap);
+ }
+
+ return flags;
+}
+
+void HidlManager::notifyTransitionDisable(struct wpa_supplicant *wpa_s,
+ struct wpa_ssid *ssid, u8 bitmap)
+{
+ uint32_t flag = setTransitionDisableFlagsMask(bitmap);
+ const std::function<
+ Return<void>(android::sp<V1_4::ISupplicantStaNetworkCallback>)>
+ func = std::bind(
+ &V1_4::ISupplicantStaNetworkCallback::onTransitionDisable,
+ std::placeholders::_1, flag);
+
+ callWithEachStaNetworkCallbackDerived(wpa_s->ifname, ssid->id, func);
+}
+
+
/**
* Retrieve the |ISupplicantP2pIface| hidl object reference using the provided
* ifname.
@@ -2193,6 +2275,24 @@
callWithEachNetworkCallback(
ifname, network_id, method, sta_network_callbacks_map_);
}
+
+/**
+ * Helper function to invoke the provided callback method on all the
+ * registered derived interface callback hidl objects for the specified
+ * |ifname|.
+ *
+ * @param ifname Name of the corresponding interface.
+ * @param method Pointer to the required hidl method from
+ * derived |V1_x::ISupplicantIfaceCallback|.
+ */
+template <class CallbackTypeDerived>
+void HidlManager::callWithEachStaNetworkCallbackDerived(
+ const std::string &ifname, int network_id,
+ const std::function<
+ Return<void>(android::sp<CallbackTypeDerived>)> &method)
+{
+ callWithEachNetworkCallbackDerived(ifname, network_id, method, sta_network_callbacks_map_);
+}
} // namespace implementation
} // namespace V1_4
} // namespace supplicant
diff --git a/wpa_supplicant/hidl/1.4/hidl_manager.h b/wpa_supplicant/hidl/1.4/hidl_manager.h
index 496ceae..5c01cdd 100644
--- a/wpa_supplicant/hidl/1.4/hidl_manager.h
+++ b/wpa_supplicant/hidl/1.4/hidl_manager.h
@@ -18,6 +18,7 @@
#include <android/hardware/wifi/supplicant/1.0/ISupplicantP2pNetworkCallback.h>
#include <android/hardware/wifi/supplicant/1.0/ISupplicantStaIfaceCallback.h>
#include <android/hardware/wifi/supplicant/1.0/ISupplicantStaNetworkCallback.h>
+#include <android/hardware/wifi/supplicant/1.4/ISupplicantStaNetworkCallback.h>
#include "p2p_iface.h"
#include "p2p_network.h"
@@ -166,6 +167,9 @@
void notifyPmkCacheAdded(struct wpa_supplicant *wpa_s,
struct rsn_pmksa_cache_entry *pmksa_entry);
void notifyBssTmStatus(struct wpa_supplicant *wpa_s);
+ void notifyTransitionDisable(struct wpa_supplicant *wpa_s,
+ struct wpa_ssid *ssid,
+ u8 bitmap);
// Methods called from hidl objects.
void notifyExtRadioWorkStart(struct wpa_supplicant *wpa_s, uint32_t id);
@@ -258,6 +262,11 @@
const std::string &ifname, int network_id,
const std::function<android::hardware::Return<void>(
android::sp<ISupplicantStaNetworkCallback>)> &method);
+ template <class CallbackTypeDerived>
+ void callWithEachStaNetworkCallbackDerived(
+ const std::string &ifname, int network_id,
+ const std::function<
+ Return<void>(android::sp<CallbackTypeDerived>)> &method);
// Singleton instance of this class.
static HidlManager *instance_;
diff --git a/wpa_supplicant/hidl/1.4/sta_network.cpp b/wpa_supplicant/hidl/1.4/sta_network.cpp
index a87c9eb..2bd9adc 100644
--- a/wpa_supplicant/hidl/1.4/sta_network.cpp
+++ b/wpa_supplicant/hidl/1.4/sta_network.cpp
@@ -156,6 +156,15 @@
&StaNetwork::registerCallbackInternal, _hidl_cb, callback);
}
+Return<void> StaNetwork::registerCallback_1_4(
+ const sp<V1_4::ISupplicantStaNetworkCallback> &callback,
+ registerCallback_1_4_cb _hidl_cb)
+{
+ return validateAndCall(
+ this, SupplicantStatusCode::FAILURE_NETWORK_INVALID,
+ &StaNetwork::registerCallback_1_4Internal, _hidl_cb, callback);
+}
+
Return<void> StaNetwork::setSsid(
const hidl_vec<uint8_t> &ssid, setSsid_cb _hidl_cb)
{
@@ -995,6 +1004,12 @@
SupplicantStatus StaNetwork::registerCallbackInternal(
const sp<ISupplicantStaNetworkCallback> &callback)
{
+ return {SupplicantStatusCode::FAILURE_UNKNOWN, "deprecated"};
+}
+
+SupplicantStatus StaNetwork::registerCallback_1_4Internal(
+ const sp<V1_4::ISupplicantStaNetworkCallback> &callback)
+{
HidlManager *hidl_manager = HidlManager::getInstance();
if (!hidl_manager || hidl_manager->addStaNetworkCallbackHidlObject(
ifname_, network_id_, callback)) {
diff --git a/wpa_supplicant/hidl/1.4/sta_network.h b/wpa_supplicant/hidl/1.4/sta_network.h
index 83b47d0..5c07aba 100644
--- a/wpa_supplicant/hidl/1.4/sta_network.h
+++ b/wpa_supplicant/hidl/1.4/sta_network.h
@@ -62,6 +62,9 @@
Return<void> registerCallback(
const sp<ISupplicantStaNetworkCallback>& callback,
registerCallback_cb _hidl_cb) override;
+ Return<void> registerCallback_1_4(
+ const sp<V1_4::ISupplicantStaNetworkCallback>& callback,
+ registerCallback_1_4_cb _hidl_cb) override;
Return<void> setSsid(
const hidl_vec<uint8_t>& ssid, setSsid_cb _hidl_cb) override;
Return<void> setBssid(
@@ -276,6 +279,8 @@
std::pair<SupplicantStatus, IfaceType> getTypeInternal();
SupplicantStatus registerCallbackInternal(
const sp<ISupplicantStaNetworkCallback>& callback);
+ SupplicantStatus registerCallback_1_4Internal(
+ const sp<V1_4::ISupplicantStaNetworkCallback>& callback);
SupplicantStatus setSsidInternal(const std::vector<uint8_t>& ssid);
SupplicantStatus setBssidInternal(const std::array<uint8_t, 6>& bssid);
SupplicantStatus setScanSsidInternal(bool enable);
diff --git a/wpa_supplicant/notify.c b/wpa_supplicant/notify.c
index 16e747f..3cd85aa 100644
--- a/wpa_supplicant/notify.c
+++ b/wpa_supplicant/notify.c
@@ -1208,3 +1208,16 @@
wpas_hidl_notify_pmk_cache_added(wpa_s, entry);
}
+
+void wpas_notify_transition_disable(struct wpa_supplicant *wpa_s,
+ struct wpa_ssid *ssid,
+ u8 bitmap)
+{
+ if (!wpa_s)
+ return;
+
+ if (!ssid)
+ return;
+
+ wpas_hidl_notify_transition_disable(wpa_s, ssid, bitmap);
+}
diff --git a/wpa_supplicant/notify.h b/wpa_supplicant/notify.h
index 0e7991b..c02b3ba 100644
--- a/wpa_supplicant/notify.h
+++ b/wpa_supplicant/notify.h
@@ -194,5 +194,8 @@
void wpas_notify_dpp_config_rejected(struct wpa_supplicant *wpa_s);
void wpas_notify_pmk_cache_added(struct wpa_supplicant *wpa_s,
struct rsn_pmksa_cache_entry *entry);
+void wpas_notify_transition_disable(struct wpa_supplicant *wpa_s,
+ struct wpa_ssid *ssid,
+ u8 bitmap);
#endif /* NOTIFY_H */
diff --git a/wpa_supplicant/wpas_glue.c b/wpa_supplicant/wpas_glue.c
index a9a66ba..4462afc 100644
--- a/wpa_supplicant/wpas_glue.c
+++ b/wpa_supplicant/wpas_glue.c
@@ -1331,6 +1331,8 @@
changed = 1;
}
+ wpas_notify_transition_disable(wpa_s, ssid, bitmap);
+
if (!changed)
return;