sta_iface.cpp revision 5712631c22c328fa5db65cec7575afaefbb2a720
1e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt/*
257ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius * hidl interface for wpa_supplicant daemon
3e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt * Copyright (c) 2004-2016, Jouni Malinen <j@w1.fi>
4e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt * Copyright (c) 2004-2016, Roshan Pius <rpius@google.com>
5e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt *
6e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt * This software may be distributed under the terms of the BSD license.
7e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt * See README for more details.
8e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt */
9e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt
1057ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius#include "hidl_manager.h"
114b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius#include "hidl_return_util.h"
126a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius#include "iface_config_utils.h"
13bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius#include "sta_iface.h"
14e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt
1508f74c46f8051414c23a837b68edfd507202f3f7Roshan Piusextern "C" {
1694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius#include "utils/eloop.h"
1708f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius#include "gas_query.h"
1808f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius#include "interworking.h"
1908f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius#include "hs20_supplicant.h"
20149327590e009d96301e69772e717e227215d5acRoshan Pius#include "wps_supplicant.h"
2108f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius}
2208f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius
2308f74c46f8051414c23a837b68edfd507202f3f7Roshan Piusnamespace {
2494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Piususing android::hardware::wifi::supplicant::V1_0::ISupplicantStaIface;
2594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Piususing android::hardware::wifi::supplicant::V1_0::SupplicantStatus;
2694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Piususing android::hardware::wifi::supplicant::V1_0::SupplicantStatusCode;
2794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Piususing android::hardware::wifi::supplicant::V1_0::implementation::HidlManager;
2894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius
2908f74c46f8051414c23a837b68edfd507202f3f7Roshan Piusconstexpr uint32_t kMaxAnqpElems = 100;
303599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kGetMacAddress[] = "MACADDR";
313599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kStartRxFilter[] = "RXFILTER-START";
323599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kStopRxFilter[] = "RXFILTER-STOP";
333599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kAddRxFilter[] = "RXFILTER-ADD";
343599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kRemoveRxFilter[] = "RXFILTER-REMOVE";
353599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kSetBtCoexistenceMode[] = "BTCOEXMODE";
363599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kSetBtCoexistenceScanStart[] = "BTCOEXSCAN-START";
373599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kSetBtCoexistenceScanStop[] = "BTCOEXSCAN-STOP";
383599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kSetSupendModeEnabled[] = "SETSUSPENDMODE 1";
393599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kSetSupendModeDisabled[] = "SETSUSPENDMODE 0";
401295dfb961a5dc5186ebc58753cf82eaba16e51fRoshan Piusconstexpr char kSetCountryCode[] = "COUNTRY";
4194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Piusconstexpr uint32_t kExtRadioWorkDefaultTimeoutInSec = static_cast<uint32_t>(
4294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius    ISupplicantStaIface::ExtRadioWorkDefaults::TIMEOUT_IN_SECS);
4394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Piusconstexpr char kExtRadioWorkNamePrefix[] = "ext:";
443599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
453599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusuint8_t convertHidlRxFilterTypeToInternal(
463599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    ISupplicantStaIface::RxFilterType type)
473599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
483599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	switch (type) {
493599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	case ISupplicantStaIface::RxFilterType::V4_MULTICAST:
503599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		return 2;
513599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	case ISupplicantStaIface::RxFilterType::V6_MULTICAST:
523599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		return 3;
533599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	};
543599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	WPA_ASSERT(false);
553599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
563599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
573599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusuint8_t convertHidlBtCoexModeToInternal(
583599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    ISupplicantStaIface::BtCoexistenceMode mode)
593599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
603599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	switch (mode) {
613599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	case ISupplicantStaIface::BtCoexistenceMode::ENABLED:
623599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		return 0;
633599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	case ISupplicantStaIface::BtCoexistenceMode::DISABLED:
643599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		return 1;
653599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	case ISupplicantStaIface::BtCoexistenceMode::SENSE:
663599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		return 2;
673599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	};
683599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	WPA_ASSERT(false);
693599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
703599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
713599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus doZeroArgDriverCommand(
723599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    struct wpa_supplicant *wpa_s, const char *cmd)
733599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
743599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	std::vector<char> cmd_vec(cmd, cmd + strlen(cmd) + 1);
753599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	char driver_cmd_reply_buf[4096] = {};
763599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	if (wpa_drv_driver_cmd(
773599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		wpa_s, cmd_vec.data(), driver_cmd_reply_buf,
783599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		sizeof(driver_cmd_reply_buf))) {
793599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		return {SupplicantStatusCode::FAILURE_UNKNOWN, ""};
803599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	}
813599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
823599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
833599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
843599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus doOneArgDriverCommand(
853599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    struct wpa_supplicant *wpa_s, const char *cmd, uint8_t arg)
863599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
873599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	std::string cmd_str = std::string(cmd) + " " + std::to_string(arg);
883599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return doZeroArgDriverCommand(wpa_s, cmd_str.c_str());
893599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
903599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
913599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus doOneArgDriverCommand(
923599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    struct wpa_supplicant *wpa_s, const char *cmd, const std::string &arg)
933599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
943599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	std::string cmd_str = std::string(cmd) + " " + arg;
953599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return doZeroArgDriverCommand(wpa_s, cmd_str.c_str());
963599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
9794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius
9894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Piusvoid endExtRadioWork(struct wpa_radio_work *work)
9994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{
10094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	auto *ework = static_cast<struct wpa_external_work *>(work->ctx);
10194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	work->wpa_s->ext_work_in_progress = 0;
10294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	radio_work_done(work);
10394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	os_free(ework);
10494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius}
10594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius
10694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Piusvoid extRadioWorkTimeoutCb(void *eloop_ctx, void *timeout_ctx)
10794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{
10894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	auto *work = static_cast<struct wpa_radio_work *>(eloop_ctx);
10994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	auto *ework = static_cast<struct wpa_external_work *>(work->ctx);
11094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	wpa_dbg(
11194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	    work->wpa_s, MSG_DEBUG, "Timing out external radio work %u (%s)",
11294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	    ework->id, work->type);
11394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius
11494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	HidlManager *hidl_manager = HidlManager::getInstance();
11594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	WPA_ASSERT(hidl_manager);
11694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	hidl_manager->notifyExtRadioWorkTimeout(work->wpa_s, ework->id);
11794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius
11894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	endExtRadioWork(work);
11994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius}
12094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius
12194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Piusvoid startExtRadioWork(struct wpa_radio_work *work)
12294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{
12394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	auto *ework = static_cast<struct wpa_external_work *>(work->ctx);
12494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	work->wpa_s->ext_work_in_progress = 1;
12594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	if (!ework->timeout) {
12694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius		ework->timeout = kExtRadioWorkDefaultTimeoutInSec;
12794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	}
12894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	eloop_register_timeout(
12994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	    ework->timeout, 0, extRadioWorkTimeoutCb, work, nullptr);
13094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius}
13194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius
13294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Piusvoid extRadioWorkStartCb(struct wpa_radio_work *work, int deinit)
13394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{
13494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	// deinit==1 is invoked during interface removal. Since the HIDL
13594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	// interface does not support interface addition/removal, we don't
13694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	// need to handle this scenario.
13794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	WPA_ASSERT(!deinit);
13894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius
13994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	auto *ework = static_cast<struct wpa_external_work *>(work->ctx);
14094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	wpa_dbg(
14194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	    work->wpa_s, MSG_DEBUG, "Starting external radio work %u (%s)",
14294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	    ework->id, ework->type);
14394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius
14494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	HidlManager *hidl_manager = HidlManager::getInstance();
14594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	WPA_ASSERT(hidl_manager);
14694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	hidl_manager->notifyExtRadioWorkStart(work->wpa_s, ework->id);
14794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius
14894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	startExtRadioWork(work);
14994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius}
15094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius
15108f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius}  // namespace
15208f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius
1537c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace android {
1547c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace hardware {
1557c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace wifi {
1567c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace supplicant {
1577c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace V1_0 {
1587c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace implementation {
1594b527167fea5e519091442036c6c0fa0d03c7806Roshan Piususing hidl_return_util::validateAndCall;
1608702ba9091ab6dd6702afedb7021c1caa277f8d4Roshan Pius
161bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan PiusStaIface::StaIface(struct wpa_global *wpa_global, const char ifname[])
1624b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius    : wpa_global_(wpa_global), ifname_(ifname), is_valid_(true)
16354e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius{
16454e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius}
165e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt
1664b527167fea5e519091442036c6c0fa0d03c7806Roshan Piusvoid StaIface::invalidate() { is_valid_ = false; }
1674b527167fea5e519091442036c6c0fa0d03c7806Roshan Piusbool StaIface::isValid()
16854e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius{
1694b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return (is_valid_ && (retrieveIfacePtr() != nullptr));
1704b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius}
1717c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius
1724b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::getName(getName_cb _hidl_cb)
1734b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{
1744b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return validateAndCall(
1754b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
1764b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    &StaIface::getNameInternal, _hidl_cb);
17754e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius}
17854e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius
179bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan PiusReturn<void> StaIface::getType(getType_cb _hidl_cb)
180d6e375115b04e4ce30144a6a21ef4b1f8d3a0071Roshan Pius{
1814b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return validateAndCall(
1824b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
1834b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    &StaIface::getTypeInternal, _hidl_cb);
184bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius}
185bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius
186bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan PiusReturn<void> StaIface::addNetwork(addNetwork_cb _hidl_cb)
187bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius{
1884b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return validateAndCall(
1894b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
1904b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    &StaIface::addNetworkInternal, _hidl_cb);
1914b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius}
1924b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius
1934b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::removeNetwork(
1944b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius    SupplicantNetworkId id, removeNetwork_cb _hidl_cb)
1954b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{
1964b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return validateAndCall(
1974b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
1984b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    &StaIface::removeNetworkInternal, _hidl_cb, id);
1994b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius}
2004b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius
2014b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::getNetwork(
2024b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius    SupplicantNetworkId id, getNetwork_cb _hidl_cb)
2034b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{
2044b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return validateAndCall(
2054b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
2064b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    &StaIface::getNetworkInternal, _hidl_cb, id);
2074b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius}
2084b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius
2094b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::listNetworks(listNetworks_cb _hidl_cb)
2104b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{
2114b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return validateAndCall(
2124b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
2134b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    &StaIface::listNetworksInternal, _hidl_cb);
2144b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius}
2154b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius
2164b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::registerCallback(
2174b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius    const sp<ISupplicantStaIfaceCallback> &callback,
2184b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius    registerCallback_cb _hidl_cb)
2194b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{
2204b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return validateAndCall(
2214b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
2224b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    &StaIface::registerCallbackInternal, _hidl_cb, callback);
2234b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius}
2244b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius
2254b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::reassociate(reassociate_cb _hidl_cb)
2264b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{
2274b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return validateAndCall(
2284b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
2294b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    &StaIface::reassociateInternal, _hidl_cb);
2304b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius}
2314b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius
2324b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::reconnect(reconnect_cb _hidl_cb)
2334b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{
2344b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return validateAndCall(
2354b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
2364b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    &StaIface::reconnectInternal, _hidl_cb);
2374b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius}
2384b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius
2394b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::disconnect(disconnect_cb _hidl_cb)
2404b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{
2414b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return validateAndCall(
2424b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
2434b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    &StaIface::disconnectInternal, _hidl_cb);
2444b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius}
2454b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius
2464b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::setPowerSave(bool enable, setPowerSave_cb _hidl_cb)
2474b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{
2484b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return validateAndCall(
2494b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
2504b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    &StaIface::setPowerSaveInternal, _hidl_cb, enable);
2514b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius}
2524b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius
2534b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::initiateTdlsDiscover(
2544b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius    const hidl_array<uint8_t, 6> &mac_address, initiateTdlsDiscover_cb _hidl_cb)
2554b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{
2564b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return validateAndCall(
2574b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
2584b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    &StaIface::initiateTdlsDiscoverInternal, _hidl_cb, mac_address);
2594b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius}
2604b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius
2614b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::initiateTdlsSetup(
2624b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius    const hidl_array<uint8_t, 6> &mac_address, initiateTdlsSetup_cb _hidl_cb)
2634b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{
2644b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return validateAndCall(
2654b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
2664b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    &StaIface::initiateTdlsSetupInternal, _hidl_cb, mac_address);
2674b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius}
2684b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius
2694b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::initiateTdlsTeardown(
2704b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius    const hidl_array<uint8_t, 6> &mac_address, initiateTdlsTeardown_cb _hidl_cb)
2714b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{
2724b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return validateAndCall(
2734b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
2744b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    &StaIface::initiateTdlsTeardownInternal, _hidl_cb, mac_address);
2754b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius}
276802517d19b6192b17c81e7ccbd036f8d2115433aRoshan PiusReturn<void> StaIface::initiateAnqpQuery(
277802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius    const hidl_array<uint8_t, 6> &mac_address,
278802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius    const hidl_vec<ISupplicantStaIface::AnqpInfoId> &info_elements,
279802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius    const hidl_vec<ISupplicantStaIface::Hs20AnqpSubtypes> &sub_types,
280802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius    initiateAnqpQuery_cb _hidl_cb)
281802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius{
282802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius	return validateAndCall(
283802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
284802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius	    &StaIface::initiateAnqpQueryInternal, _hidl_cb, mac_address,
285802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius	    info_elements, sub_types);
286802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius}
287802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius
288802517d19b6192b17c81e7ccbd036f8d2115433aRoshan PiusReturn<void> StaIface::initiateHs20IconQuery(
289802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius    const hidl_array<uint8_t, 6> &mac_address, const hidl_string &file_name,
290802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius    initiateHs20IconQuery_cb _hidl_cb)
291802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius{
292802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius	return validateAndCall(
293802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
294802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius	    &StaIface::initiateHs20IconQueryInternal, _hidl_cb, mac_address,
295802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius	    file_name);
296802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius}
2974b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius
2983599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusReturn<void> StaIface::getMacAddress(getMacAddress_cb _hidl_cb)
2993599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
3003599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return validateAndCall(
3013599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
3023599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    &StaIface::getMacAddressInternal, _hidl_cb);
3033599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
3043599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
3053599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusReturn<void> StaIface::startRxFilter(startRxFilter_cb _hidl_cb)
3063599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
3073599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return validateAndCall(
3083599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
3093599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    &StaIface::startRxFilterInternal, _hidl_cb);
3103599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
3113599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
3123599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusReturn<void> StaIface::stopRxFilter(stopRxFilter_cb _hidl_cb)
3133599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
3143599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return validateAndCall(
3153599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
3163599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    &StaIface::stopRxFilterInternal, _hidl_cb);
3173599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
3183599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
3193599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusReturn<void> StaIface::addRxFilter(
3203599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    ISupplicantStaIface::RxFilterType type, addRxFilter_cb _hidl_cb)
3213599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
3223599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return validateAndCall(
3233599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
3243599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    &StaIface::addRxFilterInternal, _hidl_cb, type);
3253599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
3263599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
3273599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusReturn<void> StaIface::removeRxFilter(
3283599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    ISupplicantStaIface::RxFilterType type, removeRxFilter_cb _hidl_cb)
3293599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
3303599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return validateAndCall(
3313599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
3323599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    &StaIface::removeRxFilterInternal, _hidl_cb, type);
3333599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
3343599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
3353599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusReturn<void> StaIface::setBtCoexistenceMode(
3363599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    ISupplicantStaIface::BtCoexistenceMode mode,
3373599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    setBtCoexistenceMode_cb _hidl_cb)
3383599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
3393599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return validateAndCall(
3403599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
3413599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    &StaIface::setBtCoexistenceModeInternal, _hidl_cb, mode);
3423599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
3433599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
3443599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusReturn<void> StaIface::setBtCoexistenceScanModeEnabled(
3453599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    bool enable, setBtCoexistenceScanModeEnabled_cb _hidl_cb)
3463599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
3473599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return validateAndCall(
3483599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
3493599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    &StaIface::setBtCoexistenceScanModeEnabledInternal, _hidl_cb,
3503599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    enable);
3513599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
3523599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
3533599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusReturn<void> StaIface::setSuspendModeEnabled(
3543599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    bool enable, setSuspendModeEnabled_cb _hidl_cb)
3553599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
3563599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return validateAndCall(
3573599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
3583599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    &StaIface::setSuspendModeEnabledInternal, _hidl_cb, enable);
3593599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
3603599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
3613599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusReturn<void> StaIface::setCountryCode(
3623599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    const hidl_array<int8_t, 2> &code, setCountryCode_cb _hidl_cb)
3633599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
3643599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return validateAndCall(
3653599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
3663599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    &StaIface::setCountryCodeInternal, _hidl_cb, code);
3673599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
3683599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
369149327590e009d96301e69772e717e227215d5acRoshan PiusReturn<void> StaIface::startWpsRegistrar(
370149327590e009d96301e69772e717e227215d5acRoshan Pius    const hidl_array<uint8_t, 6> &bssid, const hidl_string &pin,
371149327590e009d96301e69772e717e227215d5acRoshan Pius    startWpsRegistrar_cb _hidl_cb)
372149327590e009d96301e69772e717e227215d5acRoshan Pius{
373149327590e009d96301e69772e717e227215d5acRoshan Pius	return validateAndCall(
374149327590e009d96301e69772e717e227215d5acRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
375149327590e009d96301e69772e717e227215d5acRoshan Pius	    &StaIface::startWpsRegistrarInternal, _hidl_cb, bssid, pin);
376149327590e009d96301e69772e717e227215d5acRoshan Pius}
377149327590e009d96301e69772e717e227215d5acRoshan Pius
378149327590e009d96301e69772e717e227215d5acRoshan PiusReturn<void> StaIface::startWpsPbc(
379149327590e009d96301e69772e717e227215d5acRoshan Pius    const hidl_array<uint8_t, 6> &bssid, startWpsPbc_cb _hidl_cb)
380149327590e009d96301e69772e717e227215d5acRoshan Pius{
381149327590e009d96301e69772e717e227215d5acRoshan Pius	return validateAndCall(
382149327590e009d96301e69772e717e227215d5acRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
383149327590e009d96301e69772e717e227215d5acRoshan Pius	    &StaIface::startWpsPbcInternal, _hidl_cb, bssid);
384149327590e009d96301e69772e717e227215d5acRoshan Pius}
385149327590e009d96301e69772e717e227215d5acRoshan Pius
386149327590e009d96301e69772e717e227215d5acRoshan PiusReturn<void> StaIface::startWpsPinKeypad(
387149327590e009d96301e69772e717e227215d5acRoshan Pius    const hidl_string &pin, startWpsPinKeypad_cb _hidl_cb)
388149327590e009d96301e69772e717e227215d5acRoshan Pius{
389149327590e009d96301e69772e717e227215d5acRoshan Pius	return validateAndCall(
390149327590e009d96301e69772e717e227215d5acRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
391149327590e009d96301e69772e717e227215d5acRoshan Pius	    &StaIface::startWpsPinKeypadInternal, _hidl_cb, pin);
392149327590e009d96301e69772e717e227215d5acRoshan Pius}
393149327590e009d96301e69772e717e227215d5acRoshan Pius
394149327590e009d96301e69772e717e227215d5acRoshan PiusReturn<void> StaIface::startWpsPinDisplay(
395149327590e009d96301e69772e717e227215d5acRoshan Pius    const hidl_array<uint8_t, 6> &bssid, startWpsPinDisplay_cb _hidl_cb)
396149327590e009d96301e69772e717e227215d5acRoshan Pius{
397149327590e009d96301e69772e717e227215d5acRoshan Pius	return validateAndCall(
398149327590e009d96301e69772e717e227215d5acRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
399149327590e009d96301e69772e717e227215d5acRoshan Pius	    &StaIface::startWpsPinDisplayInternal, _hidl_cb, bssid);
400149327590e009d96301e69772e717e227215d5acRoshan Pius}
401149327590e009d96301e69772e717e227215d5acRoshan Pius
402149327590e009d96301e69772e717e227215d5acRoshan PiusReturn<void> StaIface::cancelWps(cancelWps_cb _hidl_cb)
403149327590e009d96301e69772e717e227215d5acRoshan Pius{
404149327590e009d96301e69772e717e227215d5acRoshan Pius	return validateAndCall(
405149327590e009d96301e69772e717e227215d5acRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
406149327590e009d96301e69772e717e227215d5acRoshan Pius	    &StaIface::cancelWpsInternal, _hidl_cb);
407149327590e009d96301e69772e717e227215d5acRoshan Pius}
408149327590e009d96301e69772e717e227215d5acRoshan Pius
4096a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusReturn<void> StaIface::setWpsDeviceName(
4106a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius    const hidl_string &name, setWpsDeviceName_cb _hidl_cb)
4116a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{
4126a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	return validateAndCall(
4136a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
4146a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	    &StaIface::setWpsDeviceNameInternal, _hidl_cb, name);
4156a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius}
4166a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius
41794426e651275a0ef2261783b7eb13aa64012bbc8Roshan PiusReturn<void> StaIface::setWpsDeviceType(
41894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius    const hidl_array<uint8_t, 8> &type, setWpsDeviceType_cb _hidl_cb)
41994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{
42094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	return validateAndCall(
42194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
42294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	    &StaIface::setWpsDeviceTypeInternal, _hidl_cb, type);
42394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius}
42494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius
4256a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusReturn<void> StaIface::setWpsManufacturer(
4266a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius    const hidl_string &manufacturer, setWpsManufacturer_cb _hidl_cb)
4276a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{
4286a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	return validateAndCall(
4296a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
4306a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	    &StaIface::setWpsManufacturerInternal, _hidl_cb, manufacturer);
4316a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius}
4326a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius
4336a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusReturn<void> StaIface::setWpsModelName(
4346a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius    const hidl_string &model_name, setWpsModelName_cb _hidl_cb)
4356a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{
4366a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	return validateAndCall(
4376a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
4386a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	    &StaIface::setWpsModelNameInternal, _hidl_cb, model_name);
4396a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius}
4406a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius
4416a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusReturn<void> StaIface::setWpsModelNumber(
4426a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius    const hidl_string &model_number, setWpsModelNumber_cb _hidl_cb)
4436a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{
4446a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	return validateAndCall(
4456a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
4466a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	    &StaIface::setWpsModelNumberInternal, _hidl_cb, model_number);
4476a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius}
4486a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius
4496a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusReturn<void> StaIface::setWpsSerialNumber(
4506a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius    const hidl_string &serial_number, setWpsSerialNumber_cb _hidl_cb)
4516a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{
4526a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	return validateAndCall(
4536a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
4546a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	    &StaIface::setWpsSerialNumberInternal, _hidl_cb, serial_number);
4556a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius}
4566a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius
4576a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusReturn<void> StaIface::setWpsConfigMethods(
4586a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius    uint16_t config_methods, setWpsConfigMethods_cb _hidl_cb)
4596a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{
4606a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	return validateAndCall(
4616a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
4626a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	    &StaIface::setWpsConfigMethodsInternal, _hidl_cb, config_methods);
4636a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius}
4646a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius
4656a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusReturn<void> StaIface::setExternalSim(
4666a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius    bool useExternalSim, setExternalSim_cb _hidl_cb)
4676a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{
4686a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	return validateAndCall(
4696a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
4706a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	    &StaIface::setExternalSimInternal, _hidl_cb, useExternalSim);
4716a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius}
4726a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius
47394426e651275a0ef2261783b7eb13aa64012bbc8Roshan PiusReturn<void> StaIface::addExtRadioWork(
47494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius    const hidl_string &name, uint32_t freq_in_mhz, uint32_t timeout_in_sec,
47594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius    addExtRadioWork_cb _hidl_cb)
47694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{
47794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	return validateAndCall(
47894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
47994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	    &StaIface::addExtRadioWorkInternal, _hidl_cb, name, freq_in_mhz,
48094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	    timeout_in_sec);
48194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius}
48294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius
48394426e651275a0ef2261783b7eb13aa64012bbc8Roshan PiusReturn<void> StaIface::removeExtRadioWork(
48494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius    uint32_t id, removeExtRadioWork_cb _hidl_cb)
48594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{
48694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	return validateAndCall(
48794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
48894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	    &StaIface::removeExtRadioWorkInternal, _hidl_cb, id);
48994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius}
49094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius
4915712631c22c328fa5db65cec7575afaefbb2a720Roshan PiusReturn<void> StaIface::enableAutoReconnect(
4925712631c22c328fa5db65cec7575afaefbb2a720Roshan Pius    bool enable, enableAutoReconnect_cb _hidl_cb)
4935712631c22c328fa5db65cec7575afaefbb2a720Roshan Pius{
4945712631c22c328fa5db65cec7575afaefbb2a720Roshan Pius	return validateAndCall(
4955712631c22c328fa5db65cec7575afaefbb2a720Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
4965712631c22c328fa5db65cec7575afaefbb2a720Roshan Pius	    &StaIface::enableAutoReconnectInternal, _hidl_cb, enable);
4975712631c22c328fa5db65cec7575afaefbb2a720Roshan Pius}
4985712631c22c328fa5db65cec7575afaefbb2a720Roshan Pius
4994b527167fea5e519091442036c6c0fa0d03c7806Roshan Piusstd::pair<SupplicantStatus, std::string> StaIface::getNameInternal()
5004b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{
5014b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return {{SupplicantStatusCode::SUCCESS, ""}, ifname_};
5024b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius}
5034b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius
5044b527167fea5e519091442036c6c0fa0d03c7806Roshan Piusstd::pair<SupplicantStatus, IfaceType> StaIface::getTypeInternal()
5054b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{
5064b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return {{SupplicantStatusCode::SUCCESS, ""}, IfaceType::STA};
5074b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius}
5084b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius
5094b527167fea5e519091442036c6c0fa0d03c7806Roshan Piusstd::pair<SupplicantStatus, sp<ISupplicantNetwork>>
5104b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusStaIface::addNetworkInternal()
5114b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{
512bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius	android::sp<ISupplicantStaNetwork> network;
513d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
514f745df8121ceec43d19edba801ab7b3d1c689a2aRoshan Pius	struct wpa_ssid *ssid = wpa_supplicant_add_network(wpa_s);
515d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius	if (!ssid) {
5164b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, network};
517d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius	}
51857ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius	HidlManager *hidl_manager = HidlManager::getInstance();
51957ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius	if (!hidl_manager ||
520bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius	    hidl_manager->getStaNetworkHidlObjectByIfnameAndNetworkId(
5217c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius		wpa_s->ifname, ssid->id, &network)) {
5224b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, network};
523d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius	}
5244b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return {{SupplicantStatusCode::SUCCESS, ""}, network};
525d6e375115b04e4ce30144a6a21ef4b1f8d3a0071Roshan Pius}
526d6e375115b04e4ce30144a6a21ef4b1f8d3a0071Roshan Pius
5274b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::removeNetworkInternal(SupplicantNetworkId id)
528d6e375115b04e4ce30144a6a21ef4b1f8d3a0071Roshan Pius{
529d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
5307c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius	int result = wpa_supplicant_remove_network(wpa_s, id);
531f745df8121ceec43d19edba801ab7b3d1c689a2aRoshan Pius	if (result == -1) {
5324b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {SupplicantStatusCode::FAILURE_NETWORK_UNKNOWN, ""};
533d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius	}
5347c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius	if (result != 0) {
5354b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {SupplicantStatusCode::FAILURE_UNKNOWN, ""};
536d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius	}
5374b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
538d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius}
539d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius
5404b527167fea5e519091442036c6c0fa0d03c7806Roshan Piusstd::pair<SupplicantStatus, sp<ISupplicantNetwork>>
5414b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusStaIface::getNetworkInternal(SupplicantNetworkId id)
542d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius{
543bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius	android::sp<ISupplicantStaNetwork> network;
544d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
5457c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius	struct wpa_ssid *ssid = wpa_config_get_network(wpa_s->conf, id);
546d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius	if (!ssid) {
5474b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {{SupplicantStatusCode::FAILURE_NETWORK_UNKNOWN, ""},
5484b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius			network};
549d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius	}
55057ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius	HidlManager *hidl_manager = HidlManager::getInstance();
55157ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius	if (!hidl_manager ||
552bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius	    hidl_manager->getStaNetworkHidlObjectByIfnameAndNetworkId(
5537c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius		wpa_s->ifname, ssid->id, &network)) {
5544b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, network};
5557c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius	}
5564b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return {{SupplicantStatusCode::SUCCESS, ""}, network};
5577c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius}
5587c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius
5594b527167fea5e519091442036c6c0fa0d03c7806Roshan Piusstd::pair<SupplicantStatus, std::vector<SupplicantNetworkId>>
5604b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusStaIface::listNetworksInternal()
5617c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius{
5624b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	std::vector<SupplicantNetworkId> network_ids;
5637c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
5647c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius	for (struct wpa_ssid *wpa_ssid = wpa_s->conf->ssid; wpa_ssid;
5657c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius	     wpa_ssid = wpa_ssid->next) {
5667c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius		network_ids.emplace_back(wpa_ssid->id);
5677c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius	}
5684b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return {{SupplicantStatusCode::SUCCESS, ""}, std::move(network_ids)};
569d6e375115b04e4ce30144a6a21ef4b1f8d3a0071Roshan Pius}
570d6e375115b04e4ce30144a6a21ef4b1f8d3a0071Roshan Pius
5714b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::registerCallbackInternal(
5724b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius    const sp<ISupplicantStaIfaceCallback> &callback)
5730470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius{
57457ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius	HidlManager *hidl_manager = HidlManager::getInstance();
57557ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius	if (!hidl_manager ||
576bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius	    hidl_manager->addStaIfaceCallbackHidlObject(ifname_, callback)) {
5774b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {SupplicantStatusCode::FAILURE_UNKNOWN, ""};
5780470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius	}
5794b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
5800470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius}
5810470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius
5824b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::reassociateInternal()
583f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius{
584f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
585f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius	if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) {
5864b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {SupplicantStatusCode::FAILURE_IFACE_DISABLED, ""};
587f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius	}
5884b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	wpas_request_connection(wpa_s);
5894b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
590f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius}
591f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius
5924b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::reconnectInternal()
593f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius{
594f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
595f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius	if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) {
5964b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {SupplicantStatusCode::FAILURE_IFACE_DISABLED, ""};
597f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius	}
598f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius	if (!wpa_s->disconnected) {
5994b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {SupplicantStatusCode::FAILURE_IFACE_NOT_DISCONNECTED,
6004b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius			""};
601f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius	}
602f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius	wpas_request_connection(wpa_s);
6034b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
604f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius}
605f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius
6064b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::disconnectInternal()
607f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius{
608f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
609f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius	if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) {
6104b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {SupplicantStatusCode::FAILURE_IFACE_DISABLED, ""};
611f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius	}
612f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius	wpas_request_disconnection(wpa_s);
6134b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
614f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius}
615f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius
6164b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::setPowerSaveInternal(bool enable)
617390ba2881ef621db480848b7e50b93d61542206aRoshan Pius{
618390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
6194b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) {
6204b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {SupplicantStatusCode::FAILURE_IFACE_DISABLED, ""};
6217c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius	}
622390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	if (wpa_drv_set_p2p_powersave(wpa_s, enable, -1, -1)) {
6234b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {SupplicantStatusCode::FAILURE_UNKNOWN, ""};
624390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	}
6254b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
626390ba2881ef621db480848b7e50b93d61542206aRoshan Pius}
627390ba2881ef621db480848b7e50b93d61542206aRoshan Pius
6284b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::initiateTdlsDiscoverInternal(
6294b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius    const std::array<uint8_t, 6> &mac_address)
630390ba2881ef621db480848b7e50b93d61542206aRoshan Pius{
631390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
632390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	int ret;
633390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	const u8 *peer = mac_address.data();
634390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	if (wpa_tdls_is_external_setup(wpa_s->wpa)) {
635390ba2881ef621db480848b7e50b93d61542206aRoshan Pius		ret = wpa_tdls_send_discovery_request(wpa_s->wpa, peer);
636390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	} else {
637390ba2881ef621db480848b7e50b93d61542206aRoshan Pius		ret = wpa_drv_tdls_oper(wpa_s, TDLS_DISCOVERY_REQ, peer);
638390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	}
639390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	if (ret) {
6404b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {SupplicantStatusCode::FAILURE_UNKNOWN, ""};
641390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	}
6424b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
643390ba2881ef621db480848b7e50b93d61542206aRoshan Pius}
644390ba2881ef621db480848b7e50b93d61542206aRoshan Pius
6454b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::initiateTdlsSetupInternal(
6464b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius    const std::array<uint8_t, 6> &mac_address)
647390ba2881ef621db480848b7e50b93d61542206aRoshan Pius{
648390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
649390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	int ret;
650390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	const u8 *peer = mac_address.data();
651390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	if (wpa_tdls_is_external_setup(wpa_s->wpa) &&
652390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	    !(wpa_s->conf->tdls_external_control)) {
653390ba2881ef621db480848b7e50b93d61542206aRoshan Pius		wpa_tdls_remove(wpa_s->wpa, peer);
654390ba2881ef621db480848b7e50b93d61542206aRoshan Pius		ret = wpa_tdls_start(wpa_s->wpa, peer);
655390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	} else {
656390ba2881ef621db480848b7e50b93d61542206aRoshan Pius		ret = wpa_drv_tdls_oper(wpa_s, TDLS_SETUP, peer);
657390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	}
658390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	if (ret) {
6594b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {SupplicantStatusCode::FAILURE_UNKNOWN, ""};
660390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	}
6614b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
662390ba2881ef621db480848b7e50b93d61542206aRoshan Pius}
663390ba2881ef621db480848b7e50b93d61542206aRoshan Pius
6644b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::initiateTdlsTeardownInternal(
6654b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius    const std::array<uint8_t, 6> &mac_address)
666390ba2881ef621db480848b7e50b93d61542206aRoshan Pius{
667390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
668390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	int ret;
669390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	const u8 *peer = mac_address.data();
670390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	if (wpa_tdls_is_external_setup(wpa_s->wpa) &&
671390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	    !(wpa_s->conf->tdls_external_control)) {
672390ba2881ef621db480848b7e50b93d61542206aRoshan Pius		ret = wpa_tdls_teardown_link(
673390ba2881ef621db480848b7e50b93d61542206aRoshan Pius		    wpa_s->wpa, peer, WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED);
674390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	} else {
675390ba2881ef621db480848b7e50b93d61542206aRoshan Pius		ret = wpa_drv_tdls_oper(wpa_s, TDLS_TEARDOWN, peer);
676390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	}
677390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	if (ret) {
6784b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {SupplicantStatusCode::FAILURE_UNKNOWN, ""};
679390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	}
6804b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
681390ba2881ef621db480848b7e50b93d61542206aRoshan Pius}
682390ba2881ef621db480848b7e50b93d61542206aRoshan Pius
683802517d19b6192b17c81e7ccbd036f8d2115433aRoshan PiusSupplicantStatus StaIface::initiateAnqpQueryInternal(
684802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius    const std::array<uint8_t, 6> &mac_address,
685802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius    const std::vector<ISupplicantStaIface::AnqpInfoId> &info_elements,
686802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius    const std::vector<ISupplicantStaIface::Hs20AnqpSubtypes> &sub_types)
687802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius{
68808f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
68908f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	if (info_elements.size() > kMaxAnqpElems) {
69008f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius		return {SupplicantStatusCode::FAILURE_ARGS_INVALID, ""};
69108f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	}
692cc347610a2328522e91ad1fa1ae326945446ea1dRoshan Pius	uint16_t info_elems_buf[kMaxAnqpElems];
69308f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	uint32_t num_info_elems = 0;
69408f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	for (const auto &info_element : info_elements) {
69508f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius		info_elems_buf[num_info_elems++] =
69608f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius		    static_cast<std::underlying_type<
69708f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius			ISupplicantStaIface::AnqpInfoId>::type>(info_element);
69808f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	}
69908f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	uint32_t sub_types_bitmask = 0;
70008f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	for (const auto &type : sub_types) {
70108f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius		sub_types_bitmask |= BIT(
70208f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius		    static_cast<std::underlying_type<
70308f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius			ISupplicantStaIface::Hs20AnqpSubtypes>::type>(type));
70408f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	}
70508f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	if (anqp_send_req(
70608f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius		wpa_s, mac_address.data(), info_elems_buf, num_info_elems,
70708f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius		sub_types_bitmask, false)) {
70808f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius		return {SupplicantStatusCode::FAILURE_UNKNOWN, ""};
70908f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	}
710802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
711802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius}
712802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius
713802517d19b6192b17c81e7ccbd036f8d2115433aRoshan PiusSupplicantStatus StaIface::initiateHs20IconQueryInternal(
714802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius    const std::array<uint8_t, 6> &mac_address, const std::string &file_name)
715802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius{
71608f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
71708f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	wpa_s->fetch_osu_icon_in_progress = 0;
71808f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	if (hs20_anqp_send_req(
71908f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius		wpa_s, mac_address.data(), BIT(HS20_STYPE_ICON_REQUEST),
72008f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius		reinterpret_cast<const uint8_t *>(file_name.c_str()),
72108f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius		file_name.size(), true)) {
72208f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius		return {SupplicantStatusCode::FAILURE_UNKNOWN, ""};
72308f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	}
724802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
725802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius}
726802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius
7273599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusstd::pair<SupplicantStatus, std::array<uint8_t, 6>>
7283599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusStaIface::getMacAddressInternal()
7293599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
7303599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
7313599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	std::vector<char> cmd(
7323599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    kGetMacAddress, kGetMacAddress + sizeof(kGetMacAddress));
7333599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	char driver_cmd_reply_buf[4096] = {};
7343599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	int ret = wpa_drv_driver_cmd(
7353599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    wpa_s, cmd.data(), driver_cmd_reply_buf,
7363599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    sizeof(driver_cmd_reply_buf));
7373599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	// Reply is of the format: "Macaddr = XX:XX:XX:XX:XX:XX"
7383599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	std::string reply_str = driver_cmd_reply_buf;
7393431fd2b55ff8d6cc49e044a1032e55828168b9eRoshan Pius	if (ret < 0 || reply_str.empty() ||
7403599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    reply_str.find("=") == std::string::npos) {
7413599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, {}};
7423599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	}
7433599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	// Remove all whitespace first and then split using the delimiter "=".
7443599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	reply_str.erase(
7453599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    remove_if(reply_str.begin(), reply_str.end(), isspace),
7463599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    reply_str.end());
7473599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	std::string mac_addr_str =
7483599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    reply_str.substr(reply_str.find("=") + 1, reply_str.size());
7493599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	std::array<uint8_t, 6> mac_addr;
7503599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	if (hwaddr_aton(mac_addr_str.c_str(), mac_addr.data())) {
7513599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, {}};
7523599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	}
7533599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return {{SupplicantStatusCode::SUCCESS, ""}, mac_addr};
7543599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
7553599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
7563599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::startRxFilterInternal()
7573599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
7583599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return doZeroArgDriverCommand(retrieveIfacePtr(), kStartRxFilter);
7593599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
7603599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
7613599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::stopRxFilterInternal()
7623599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
7633599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return doZeroArgDriverCommand(retrieveIfacePtr(), kStopRxFilter);
7643599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
7653599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
7663599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::addRxFilterInternal(
7673599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    ISupplicantStaIface::RxFilterType type)
7683599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
7693599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return doOneArgDriverCommand(
7703599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    retrieveIfacePtr(), kAddRxFilter,
7713599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    convertHidlRxFilterTypeToInternal(type));
7723599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
7733599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
7743599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::removeRxFilterInternal(
7753599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    ISupplicantStaIface::RxFilterType type)
7763599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
7773599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return doOneArgDriverCommand(
7783599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    retrieveIfacePtr(), kRemoveRxFilter,
7793599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    convertHidlRxFilterTypeToInternal(type));
7803599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
7813599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
7823599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::setBtCoexistenceModeInternal(
7833599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    ISupplicantStaIface::BtCoexistenceMode mode)
7843599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
7853599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return doOneArgDriverCommand(
7863599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    retrieveIfacePtr(), kSetBtCoexistenceMode,
7873599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    convertHidlBtCoexModeToInternal(mode));
7883599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
7893599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
7903599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::setBtCoexistenceScanModeEnabledInternal(bool enable)
7913599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
7923599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	const char *cmd;
7933599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	if (enable) {
7943599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		cmd = kSetBtCoexistenceScanStart;
7953599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	} else {
7963599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		cmd = kSetBtCoexistenceScanStop;
7973599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	}
7983599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return doZeroArgDriverCommand(retrieveIfacePtr(), cmd);
7993599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
8003599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
8013599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::setSuspendModeEnabledInternal(bool enable)
8023599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
8033599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	const char *cmd;
8043599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	if (enable) {
8053599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		cmd = kSetSupendModeEnabled;
8063599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	} else {
8073599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		cmd = kSetSupendModeDisabled;
8083599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	}
8093599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return doZeroArgDriverCommand(retrieveIfacePtr(), cmd);
8103599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
8113599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
8123599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::setCountryCodeInternal(
8133599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    const std::array<int8_t, 2> &code)
8143599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
8153599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
8163599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	SupplicantStatus status = doOneArgDriverCommand(
8173599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    wpa_s, kSetCountryCode,
8183599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    std::string(std::begin(code), std::end(code)));
8193599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	if (status.code != SupplicantStatusCode::SUCCESS) {
8203599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		return status;
8213599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	}
8223599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	struct p2p_data *p2p = wpa_s->global->p2p;
8233599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	if (p2p) {
8243599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		char country[3];
8253599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		country[0] = code[0];
8263599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		country[1] = code[1];
8273599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		country[2] = 0x04;
8283599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		p2p_set_country(p2p, country);
8293599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	}
8303599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
8313599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
8323599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
833149327590e009d96301e69772e717e227215d5acRoshan PiusSupplicantStatus StaIface::startWpsRegistrarInternal(
834149327590e009d96301e69772e717e227215d5acRoshan Pius    const std::array<uint8_t, 6> &bssid, const std::string &pin)
835149327590e009d96301e69772e717e227215d5acRoshan Pius{
836149327590e009d96301e69772e717e227215d5acRoshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
837149327590e009d96301e69772e717e227215d5acRoshan Pius	if (wpas_wps_start_reg(wpa_s, bssid.data(), pin.c_str(), nullptr)) {
838149327590e009d96301e69772e717e227215d5acRoshan Pius		return {SupplicantStatusCode::FAILURE_UNKNOWN, ""};
839149327590e009d96301e69772e717e227215d5acRoshan Pius	}
840149327590e009d96301e69772e717e227215d5acRoshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
841149327590e009d96301e69772e717e227215d5acRoshan Pius}
842149327590e009d96301e69772e717e227215d5acRoshan Pius
843149327590e009d96301e69772e717e227215d5acRoshan PiusSupplicantStatus StaIface::startWpsPbcInternal(
844149327590e009d96301e69772e717e227215d5acRoshan Pius    const std::array<uint8_t, 6> &bssid)
845149327590e009d96301e69772e717e227215d5acRoshan Pius{
846149327590e009d96301e69772e717e227215d5acRoshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
847149327590e009d96301e69772e717e227215d5acRoshan Pius	const uint8_t *bssid_addr =
848149327590e009d96301e69772e717e227215d5acRoshan Pius	    is_zero_ether_addr(bssid.data()) ? nullptr : bssid.data();
849149327590e009d96301e69772e717e227215d5acRoshan Pius	if (wpas_wps_start_pbc(wpa_s, bssid_addr, 0)) {
850149327590e009d96301e69772e717e227215d5acRoshan Pius		return {SupplicantStatusCode::FAILURE_UNKNOWN, ""};
851149327590e009d96301e69772e717e227215d5acRoshan Pius	}
852149327590e009d96301e69772e717e227215d5acRoshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
853149327590e009d96301e69772e717e227215d5acRoshan Pius}
854149327590e009d96301e69772e717e227215d5acRoshan Pius
855149327590e009d96301e69772e717e227215d5acRoshan PiusSupplicantStatus StaIface::startWpsPinKeypadInternal(const std::string &pin)
856149327590e009d96301e69772e717e227215d5acRoshan Pius{
857149327590e009d96301e69772e717e227215d5acRoshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
858149327590e009d96301e69772e717e227215d5acRoshan Pius	if (wpas_wps_start_pin(
859149327590e009d96301e69772e717e227215d5acRoshan Pius		wpa_s, nullptr, pin.c_str(), 0, DEV_PW_DEFAULT)) {
860149327590e009d96301e69772e717e227215d5acRoshan Pius		return {SupplicantStatusCode::FAILURE_UNKNOWN, ""};
861149327590e009d96301e69772e717e227215d5acRoshan Pius	}
862149327590e009d96301e69772e717e227215d5acRoshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
863149327590e009d96301e69772e717e227215d5acRoshan Pius}
864149327590e009d96301e69772e717e227215d5acRoshan Pius
865149327590e009d96301e69772e717e227215d5acRoshan Piusstd::pair<SupplicantStatus, std::string> StaIface::startWpsPinDisplayInternal(
866149327590e009d96301e69772e717e227215d5acRoshan Pius    const std::array<uint8_t, 6> &bssid)
867149327590e009d96301e69772e717e227215d5acRoshan Pius{
868149327590e009d96301e69772e717e227215d5acRoshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
869149327590e009d96301e69772e717e227215d5acRoshan Pius	const uint8_t *bssid_addr =
870149327590e009d96301e69772e717e227215d5acRoshan Pius	    is_zero_ether_addr(bssid.data()) ? nullptr : bssid.data();
871149327590e009d96301e69772e717e227215d5acRoshan Pius	int pin =
872149327590e009d96301e69772e717e227215d5acRoshan Pius	    wpas_wps_start_pin(wpa_s, bssid_addr, nullptr, 0, DEV_PW_DEFAULT);
873149327590e009d96301e69772e717e227215d5acRoshan Pius	if (pin < 0) {
874149327590e009d96301e69772e717e227215d5acRoshan Pius		return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, ""};
875149327590e009d96301e69772e717e227215d5acRoshan Pius	}
876149327590e009d96301e69772e717e227215d5acRoshan Pius	std::string pin_str;
877149327590e009d96301e69772e717e227215d5acRoshan Pius	pin_str.reserve(9);
878149327590e009d96301e69772e717e227215d5acRoshan Pius	snprintf(&pin_str[0], pin_str.size(), "%08d", pin);
879149327590e009d96301e69772e717e227215d5acRoshan Pius	return {{SupplicantStatusCode::SUCCESS, ""}, pin_str};
880149327590e009d96301e69772e717e227215d5acRoshan Pius}
881149327590e009d96301e69772e717e227215d5acRoshan Pius
882149327590e009d96301e69772e717e227215d5acRoshan PiusSupplicantStatus StaIface::cancelWpsInternal()
883149327590e009d96301e69772e717e227215d5acRoshan Pius{
884149327590e009d96301e69772e717e227215d5acRoshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
885149327590e009d96301e69772e717e227215d5acRoshan Pius	if (wpas_wps_cancel(wpa_s)) {
886149327590e009d96301e69772e717e227215d5acRoshan Pius		return {SupplicantStatusCode::FAILURE_UNKNOWN, ""};
887149327590e009d96301e69772e717e227215d5acRoshan Pius	}
888149327590e009d96301e69772e717e227215d5acRoshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
889149327590e009d96301e69772e717e227215d5acRoshan Pius}
890149327590e009d96301e69772e717e227215d5acRoshan Pius
8916a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusSupplicantStatus StaIface::setWpsDeviceNameInternal(const std::string &name)
8926a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{
8936a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	return iface_config_utils::setWpsDeviceName(retrieveIfacePtr(), name);
8946a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius}
8956a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius
89694426e651275a0ef2261783b7eb13aa64012bbc8Roshan PiusSupplicantStatus StaIface::setWpsDeviceTypeInternal(
89794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius    const std::array<uint8_t, 8> &type)
89894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{
89994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	return iface_config_utils::setWpsDeviceType(retrieveIfacePtr(), type);
90094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius}
90194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius
9026a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusSupplicantStatus StaIface::setWpsManufacturerInternal(
9036a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius    const std::string &manufacturer)
9046a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{
9056a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	return iface_config_utils::setWpsManufacturer(
9066a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	    retrieveIfacePtr(), manufacturer);
9076a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius}
9086a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius
9096a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusSupplicantStatus StaIface::setWpsModelNameInternal(
9106a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius    const std::string &model_name)
9116a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{
9126a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	return iface_config_utils::setWpsModelName(
9136a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	    retrieveIfacePtr(), model_name);
9146a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius}
9156a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius
9166a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusSupplicantStatus StaIface::setWpsModelNumberInternal(
9176a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius    const std::string &model_number)
9186a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{
9196a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	return iface_config_utils::setWpsModelNumber(
9206a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	    retrieveIfacePtr(), model_number);
9216a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius}
9226a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius
9236a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusSupplicantStatus StaIface::setWpsSerialNumberInternal(
9246a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius    const std::string &serial_number)
9256a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{
9266a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	return iface_config_utils::setWpsSerialNumber(
9276a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	    retrieveIfacePtr(), serial_number);
9286a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius}
9296a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius
9306a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusSupplicantStatus StaIface::setWpsConfigMethodsInternal(uint16_t config_methods)
9316a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{
9326a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	return iface_config_utils::setWpsConfigMethods(
9336a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	    retrieveIfacePtr(), config_methods);
9346a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius}
9356a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius
9366a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusSupplicantStatus StaIface::setExternalSimInternal(bool useExternalSim)
9376a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{
9386a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	return iface_config_utils::setExternalSim(
9396a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius	    retrieveIfacePtr(), useExternalSim);
9406a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius}
9416a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius
94294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Piusstd::pair<SupplicantStatus, uint32_t> StaIface::addExtRadioWorkInternal(
94394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius    const std::string &name, uint32_t freq_in_mhz, uint32_t timeout_in_sec)
94494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{
94594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
94694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	auto *ework = static_cast<struct wpa_external_work *>(
94794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	    os_zalloc(sizeof(struct wpa_external_work)));
94894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	if (!ework) {
94994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius		return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""},
95094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius			UINT32_MAX};
95194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	}
95294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius
95394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	std::string radio_work_name = kExtRadioWorkNamePrefix + name;
95494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	os_strlcpy(ework->type, radio_work_name.c_str(), sizeof(ework->type));
95594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	ework->timeout = timeout_in_sec;
95694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	wpa_s->ext_work_id++;
95794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	if (wpa_s->ext_work_id == 0) {
95894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius		wpa_s->ext_work_id++;
95994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	}
96094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	ework->id = wpa_s->ext_work_id;
96194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius
96294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	if (radio_add_work(
96394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius		wpa_s, freq_in_mhz, ework->type, 0, extRadioWorkStartCb,
96494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius		ework)) {
96594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius		os_free(ework);
96694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius		return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""},
96794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius			UINT32_MAX};
96894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	}
96994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	return {SupplicantStatus{SupplicantStatusCode::SUCCESS, ""}, ework->id};
97094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius}
97194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius
97294426e651275a0ef2261783b7eb13aa64012bbc8Roshan PiusSupplicantStatus StaIface::removeExtRadioWorkInternal(uint32_t id)
97394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{
97494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
97594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	struct wpa_radio_work *work;
97694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	dl_list_for_each(work, &wpa_s->radio->work, struct wpa_radio_work, list)
97794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	{
97894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius		if (os_strncmp(
97994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius			work->type, kExtRadioWorkNamePrefix,
98094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius			sizeof(kExtRadioWorkNamePrefix)) != 0)
98194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius			continue;
98294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius
98394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius		auto *ework =
98494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius		    static_cast<struct wpa_external_work *>(work->ctx);
98594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius		if (ework->id != id)
98694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius			continue;
98794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius
98894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius		wpa_dbg(
98994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius		    wpa_s, MSG_DEBUG, "Completed external radio work %u (%s)",
99094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius		    ework->id, ework->type);
99194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius		eloop_cancel_timeout(extRadioWorkTimeoutCb, work, NULL);
99294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius		endExtRadioWork(work);
99394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius
99494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius		return {SupplicantStatusCode::SUCCESS, ""};
99594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	}
99694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius	return {SupplicantStatusCode::FAILURE_UNKNOWN, ""};
99794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius}
99894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius
9995712631c22c328fa5db65cec7575afaefbb2a720Roshan PiusSupplicantStatus StaIface::enableAutoReconnectInternal(bool enable)
10005712631c22c328fa5db65cec7575afaefbb2a720Roshan Pius{
10015712631c22c328fa5db65cec7575afaefbb2a720Roshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
10025712631c22c328fa5db65cec7575afaefbb2a720Roshan Pius	wpa_s->auto_reconnect_disabled = enable ? 0 : 1;
10035712631c22c328fa5db65cec7575afaefbb2a720Roshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
10045712631c22c328fa5db65cec7575afaefbb2a720Roshan Pius}
10055712631c22c328fa5db65cec7575afaefbb2a720Roshan Pius
100654e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius/**
10077c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius * Retrieve the underlying |wpa_supplicant| struct
10087c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius * pointer for this iface.
10097c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius * If the underlying iface is removed, then all RPC method calls on this object
10107c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius * will return failure.
101154e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius */
1012bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Piuswpa_supplicant *StaIface::retrieveIfacePtr()
101354e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius{
101408f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	return wpa_supplicant_get_iface(wpa_global_, ifname_.c_str());
101554e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius}
10167c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius}  // namespace implementation
10177c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius}  // namespace V1_0
10187c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius}  // namespace wifi
10197c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius}  // namespace supplicant
10207c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius}  // namespace hardware
10217c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius}  // namespace android
1022