wpa_supplicant: HIDL implementation (1/2)

Renamed all file and variable names to "HIDL" from "Binder"/"AIDL".

Commands run:
rename 's/binder/hidl/' *
find . -type f -exec sed -i "s/binder/hidl/g" {} \;
find . -type f -exec sed -i "s/Binder/Hidl/g" {} \;
find . -type f -exec sed -i "s/BINDER/HIDL/g" {} \;

Bug: 31365276
Test: None
Change-Id: I435f91540027d55143eebc03afdbf463b5b092f7
diff --git a/wpa_supplicant/hidl/iface.cpp b/wpa_supplicant/hidl/iface.cpp
new file mode 100644
index 0000000..1ba93b7
--- /dev/null
+++ b/wpa_supplicant/hidl/iface.cpp
@@ -0,0 +1,279 @@
+/*
+ * hidl interface for wpa_supplicant daemon
+ * Copyright (c) 2004-2016, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2004-2016, Roshan Pius <rpius@google.com>
+ *
+ * This software may be distributed under the terms of the BSD license.
+ * See README for more details.
+ */
+
+#include "hidl_manager.h"
+#include "iface.h"
+
+namespace wpa_supplicant_hidl {
+
+#define RETURN_IF_IFACE_INVALID(wpa_s)                                  \
+	{                                                               \
+		if (!wpa_s) {                                           \
+			return android::hidl::Status::                \
+			    fromServiceSpecificError(                   \
+				ERROR_IFACE_INVALID,                    \
+				"wpa_supplicant does not control this " \
+				"interface.");                          \
+		}                                                       \
+	}  // #define RETURN_IF_IFACE_INVALID(wpa_s)
+
+Iface::Iface(struct wpa_global *wpa_global, const char ifname[])
+    : wpa_global_(wpa_global), ifname_(ifname)
+{
+}
+
+android::hidl::Status Iface::GetName(std::string *iface_name_out)
+{
+	// We could directly return the name we hold, but let's verify
+	// if the underlying iface still exists.
+	RETURN_IF_IFACE_INVALID(retrieveIfacePtr());
+	*iface_name_out = ifname_;
+	return android::hidl::Status::ok();
+}
+
+android::hidl::Status Iface::AddNetwork(
+    android::sp<fi::w1::wpa_supplicant::INetwork> *network_object_out)
+{
+	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
+	RETURN_IF_IFACE_INVALID(wpa_s);
+
+	struct wpa_ssid *ssid = wpa_supplicant_add_network(wpa_s);
+	if (!ssid) {
+		return android::hidl::Status::fromServiceSpecificError(
+		    ERROR_GENERIC, "wpa_supplicant couldn't add this network.");
+	}
+
+	HidlManager *hidl_manager = HidlManager::getInstance();
+	if (!hidl_manager ||
+	    hidl_manager->getNetworkHidlObjectByIfnameAndNetworkId(
+		wpa_s->ifname, ssid->id, network_object_out)) {
+		return android::hidl::Status::fromServiceSpecificError(
+		    ERROR_GENERIC,
+		    "wpa_supplicant encountered a hidl error.");
+	}
+	return android::hidl::Status::ok();
+}
+
+android::hidl::Status Iface::RemoveNetwork(int network_id)
+{
+	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
+	RETURN_IF_IFACE_INVALID(wpa_s);
+
+	int result = wpa_supplicant_remove_network(wpa_s, network_id);
+	if (result == -1) {
+		return android::hidl::Status::fromServiceSpecificError(
+		    ERROR_NETWORK_UNKNOWN,
+		    "wpa_supplicant does not control this network.");
+	}
+
+	if (result == -2) {
+		return android::hidl::Status::fromServiceSpecificError(
+		    ERROR_GENERIC,
+		    "wpa_supplicant couldn't remove this network.");
+	}
+	return android::hidl::Status::ok();
+}
+
+android::hidl::Status Iface::GetNetwork(
+    int network_id,
+    android::sp<fi::w1::wpa_supplicant::INetwork> *network_object_out)
+{
+	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
+	RETURN_IF_IFACE_INVALID(wpa_s);
+
+	struct wpa_ssid *ssid = wpa_config_get_network(wpa_s->conf, network_id);
+	if (!ssid) {
+		return android::hidl::Status::fromServiceSpecificError(
+		    ERROR_NETWORK_UNKNOWN,
+		    "wpa_supplicant does not control this network.");
+	}
+
+	HidlManager *hidl_manager = HidlManager::getInstance();
+	if (!hidl_manager ||
+	    hidl_manager->getNetworkHidlObjectByIfnameAndNetworkId(
+		wpa_s->ifname, ssid->id, network_object_out)) {
+		return android::hidl::Status::fromServiceSpecificError(
+		    ERROR_GENERIC,
+		    "wpa_supplicant encountered a hidl error.");
+	}
+	return android::hidl::Status::ok();
+}
+
+android::hidl::Status Iface::RegisterCallback(
+    const android::sp<fi::w1::wpa_supplicant::IIfaceCallback> &callback)
+{
+	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
+	RETURN_IF_IFACE_INVALID(wpa_s);
+
+	HidlManager *hidl_manager = HidlManager::getInstance();
+	if (!hidl_manager ||
+	    hidl_manager->addIfaceCallbackHidlObject(ifname_, callback)) {
+		return android::hidl::Status::fromServiceSpecificError(
+		    ERROR_GENERIC,
+		    "wpa_supplicant encountered a hidl error.");
+	}
+	return android::hidl::Status::ok();
+}
+
+android::hidl::Status Iface::Reassociate()
+{
+	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
+	RETURN_IF_IFACE_INVALID(wpa_s);
+
+	if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) {
+		return android::hidl::Status::fromServiceSpecificError(
+		    ERROR_IFACE_DISABLED);
+	}
+	wpas_request_connection(wpa_s);
+	return android::hidl::Status::ok();
+}
+
+android::hidl::Status Iface::Reconnect()
+{
+	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
+	RETURN_IF_IFACE_INVALID(wpa_s);
+
+	if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) {
+		return android::hidl::Status::fromServiceSpecificError(
+		    ERROR_IFACE_DISABLED);
+	}
+	if (!wpa_s->disconnected) {
+		return android::hidl::Status::fromServiceSpecificError(
+		    ERROR_IFACE_NOT_DISCONNECTED);
+	}
+	wpas_request_connection(wpa_s);
+	return android::hidl::Status::ok();
+}
+
+android::hidl::Status Iface::Disconnect()
+{
+	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
+	RETURN_IF_IFACE_INVALID(wpa_s);
+
+	if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) {
+		return android::hidl::Status::fromServiceSpecificError(
+		    ERROR_IFACE_DISABLED);
+	}
+	wpas_request_disconnection(wpa_s);
+	return android::hidl::Status::ok();
+}
+
+android::hidl::Status Iface::SetPowerSave(bool enable)
+{
+	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
+	RETURN_IF_IFACE_INVALID(wpa_s);
+	if (wpa_drv_set_p2p_powersave(wpa_s, enable, -1, -1)) {
+		const std::string error_msg = "Failed setting power save mode" +
+					      std::to_string(enable) + ".";
+		return android::hidl::Status::fromServiceSpecificError(
+		    ERROR_GENERIC, error_msg.c_str());
+	}
+	return android::hidl::Status::ok();
+}
+
+android::hidl::Status Iface::InitiateTDLSDiscover(
+    const std::vector<uint8_t> &mac_address)
+{
+	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
+	RETURN_IF_IFACE_INVALID(wpa_s);
+
+	if (mac_address.size() != MAC_ADDRESS_LEN) {
+		const std::string error_msg =
+		    "Invalid MAC address value length: " +
+		    std::to_string(mac_address.size()) + ".";
+		return android::hidl::Status::fromExceptionCode(
+		    android::hidl::Status::EX_ILLEGAL_ARGUMENT,
+		    error_msg.c_str());
+	}
+	int ret;
+	const u8 *peer = mac_address.data();
+	if (wpa_tdls_is_external_setup(wpa_s->wpa)) {
+		ret = wpa_tdls_send_discovery_request(wpa_s->wpa, peer);
+	} else {
+		ret = wpa_drv_tdls_oper(wpa_s, TDLS_DISCOVERY_REQ, peer);
+	}
+	if (ret) {
+		return android::hidl::Status::fromServiceSpecificError(
+		    ERROR_GENERIC, "Failed to initiate TDLS Discover.");
+	}
+	return android::hidl::Status::ok();
+}
+
+android::hidl::Status Iface::InitiateTDLSSetup(
+    const std::vector<uint8_t> &mac_address)
+{
+	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
+	RETURN_IF_IFACE_INVALID(wpa_s);
+
+	if (mac_address.size() != MAC_ADDRESS_LEN) {
+		const std::string error_msg =
+		    "Invalid MAC address value length: " +
+		    std::to_string(mac_address.size()) + ".";
+		return android::hidl::Status::fromExceptionCode(
+		    android::hidl::Status::EX_ILLEGAL_ARGUMENT,
+		    error_msg.c_str());
+	}
+	int ret;
+	const u8 *peer = mac_address.data();
+	if (wpa_tdls_is_external_setup(wpa_s->wpa) &&
+	    !(wpa_s->conf->tdls_external_control)) {
+		wpa_tdls_remove(wpa_s->wpa, peer);
+		ret = wpa_tdls_start(wpa_s->wpa, peer);
+	} else {
+		ret = wpa_drv_tdls_oper(wpa_s, TDLS_SETUP, peer);
+	}
+	if (ret) {
+		return android::hidl::Status::fromServiceSpecificError(
+		    ERROR_GENERIC, "Failed to initiate TDLS Setup.");
+	}
+	return android::hidl::Status::ok();
+}
+
+android::hidl::Status Iface::InitiateTDLSTeardown(
+    const std::vector<uint8_t> &mac_address)
+{
+	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
+	RETURN_IF_IFACE_INVALID(wpa_s);
+
+	if (mac_address.size() != MAC_ADDRESS_LEN) {
+		const std::string error_msg =
+		    "Invalid MAC address value length: " +
+		    std::to_string(mac_address.size()) + ".";
+		return android::hidl::Status::fromExceptionCode(
+		    android::hidl::Status::EX_ILLEGAL_ARGUMENT,
+		    error_msg.c_str());
+	}
+	int ret;
+	const u8 *peer = mac_address.data();
+	if (wpa_tdls_is_external_setup(wpa_s->wpa) &&
+	    !(wpa_s->conf->tdls_external_control)) {
+		ret = wpa_tdls_teardown_link(
+		    wpa_s->wpa, peer, WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED);
+	} else {
+		ret = wpa_drv_tdls_oper(wpa_s, TDLS_TEARDOWN, peer);
+	}
+	if (ret) {
+		return android::hidl::Status::fromServiceSpecificError(
+		    ERROR_GENERIC, "Failed to initiate TDLS Teardown.");
+	}
+	return android::hidl::Status::ok();
+}
+
+/**
+ * Retrieve the underlying |wpa_supplicant| struct pointer for
+ * this iface.
+ * If the underlying iface is removed, then all RPC method calls
+ * on this object will return failure.
+ */
+wpa_supplicant *Iface::retrieveIfacePtr()
+{
+	return wpa_supplicant_get_iface(
+	    (struct wpa_global *)wpa_global_, ifname_.c_str());
+}
+}  // namespace wpa_supplicant_hidl