binder: Add/Implement More iface calls

Add/Implement few more |IIface| aidl object functions:
1. Power Save Mode
2. TDLS Discover
3. TDLS Setup
4. TDLS Teardown

BUG: 30759904
Change-Id: I604f8addc2fe009a2f4abb67d487d729b6558a12
TEST: None.
Signed-off-by: Roshan Pius <rpius@google.com>
diff --git a/wpa_supplicant/binder/iface.cpp b/wpa_supplicant/binder/iface.cpp
index 0ff407a..624e467 100644
--- a/wpa_supplicant/binder/iface.cpp
+++ b/wpa_supplicant/binder/iface.cpp
@@ -164,6 +164,107 @@
 	return android::binder::Status::ok();
 }
 
+android::binder::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::binder::Status::fromServiceSpecificError(
+		    ERROR_GENERIC, error_msg.c_str());
+	}
+	return android::binder::Status::ok();
+}
+
+android::binder::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::binder::Status::fromExceptionCode(
+		    android::binder::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::binder::Status::fromServiceSpecificError(
+		    ERROR_GENERIC, "Failed to initiate TDLS Discover.");
+	}
+	return android::binder::Status::ok();
+}
+
+android::binder::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::binder::Status::fromExceptionCode(
+		    android::binder::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::binder::Status::fromServiceSpecificError(
+		    ERROR_GENERIC, "Failed to initiate TDLS Setup.");
+	}
+	return android::binder::Status::ok();
+}
+
+android::binder::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::binder::Status::fromExceptionCode(
+		    android::binder::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::binder::Status::fromServiceSpecificError(
+		    ERROR_GENERIC, "Failed to initiate TDLS Teardown.");
+	}
+	return android::binder::Status::ok();
+}
+
 /**
  * Retrieve the underlying |wpa_supplicant| struct pointer for
  * this iface.