sta_iface.cpp revision 3599ac260d2eb4e40dee7738c5ed2ab44de0918c
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"
12bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius#include "sta_iface.h"
13e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt
1408f74c46f8051414c23a837b68edfd507202f3f7Roshan Piusextern "C" {
1508f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius#include "gas_query.h"
1608f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius#include "interworking.h"
1708f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius#include "hs20_supplicant.h"
1808f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius}
1908f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius
2008f74c46f8051414c23a837b68edfd507202f3f7Roshan Piusnamespace {
2108f74c46f8051414c23a837b68edfd507202f3f7Roshan Piusconstexpr uint32_t kMaxAnqpElems = 100;
223599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kGetMacAddress[] = "MACADDR";
233599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kStartRxFilter[] = "RXFILTER-START";
243599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kStopRxFilter[] = "RXFILTER-STOP";
253599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kAddRxFilter[] = "RXFILTER-ADD";
263599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kRemoveRxFilter[] = "RXFILTER-REMOVE";
273599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kSetBtCoexistenceMode[] = "BTCOEXMODE";
283599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kSetBtCoexistenceScanStart[] = "BTCOEXSCAN-START";
293599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kSetBtCoexistenceScanStop[] = "BTCOEXSCAN-STOP";
303599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kSetSupendModeEnabled[] = "SETSUSPENDMODE 1";
313599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kSetSupendModeDisabled[] = "SETSUSPENDMODE 0";
323599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kSetCountryCode[] = "COUNTRY ";
333599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
343599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piususing android::hardware::wifi::supplicant::V1_0::ISupplicantStaIface;
353599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piususing android::hardware::wifi::supplicant::V1_0::SupplicantStatus;
363599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piususing android::hardware::wifi::supplicant::V1_0::SupplicantStatusCode;
373599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
383599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusuint8_t convertHidlRxFilterTypeToInternal(
393599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    ISupplicantStaIface::RxFilterType type)
403599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
413599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	switch (type) {
423599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	case ISupplicantStaIface::RxFilterType::V4_MULTICAST:
433599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		return 2;
443599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	case ISupplicantStaIface::RxFilterType::V6_MULTICAST:
453599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		return 3;
463599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	};
473599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	WPA_ASSERT(false);
483599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
493599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
503599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusuint8_t convertHidlBtCoexModeToInternal(
513599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    ISupplicantStaIface::BtCoexistenceMode mode)
523599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
533599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	switch (mode) {
543599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	case ISupplicantStaIface::BtCoexistenceMode::ENABLED:
553599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		return 0;
563599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	case ISupplicantStaIface::BtCoexistenceMode::DISABLED:
573599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		return 1;
583599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	case ISupplicantStaIface::BtCoexistenceMode::SENSE:
593599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		return 2;
603599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	};
613599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	WPA_ASSERT(false);
623599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
633599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
643599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus doZeroArgDriverCommand(
653599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    struct wpa_supplicant *wpa_s, const char *cmd)
663599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
673599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	std::vector<char> cmd_vec(cmd, cmd + strlen(cmd) + 1);
683599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	char driver_cmd_reply_buf[4096] = {};
693599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	if (wpa_drv_driver_cmd(
703599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		wpa_s, cmd_vec.data(), driver_cmd_reply_buf,
713599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		sizeof(driver_cmd_reply_buf))) {
723599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		return {SupplicantStatusCode::FAILURE_UNKNOWN, ""};
733599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	}
743599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
753599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
763599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
773599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus doOneArgDriverCommand(
783599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    struct wpa_supplicant *wpa_s, const char *cmd, uint8_t arg)
793599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
803599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	std::string cmd_str = std::string(cmd) + " " + std::to_string(arg);
813599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return doZeroArgDriverCommand(wpa_s, cmd_str.c_str());
823599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
833599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
843599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus doOneArgDriverCommand(
853599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    struct wpa_supplicant *wpa_s, const char *cmd, const std::string &arg)
863599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
873599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	std::string cmd_str = std::string(cmd) + " " + arg;
883599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return doZeroArgDriverCommand(wpa_s, cmd_str.c_str());
893599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
9008f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius}  // namespace
9108f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius
927c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace android {
937c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace hardware {
947c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace wifi {
957c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace supplicant {
967c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace V1_0 {
977c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace implementation {
984b527167fea5e519091442036c6c0fa0d03c7806Roshan Piususing hidl_return_util::validateAndCall;
998702ba9091ab6dd6702afedb7021c1caa277f8d4Roshan Pius
100bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan PiusStaIface::StaIface(struct wpa_global *wpa_global, const char ifname[])
1014b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius    : wpa_global_(wpa_global), ifname_(ifname), is_valid_(true)
10254e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius{
10354e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius}
104e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt
1054b527167fea5e519091442036c6c0fa0d03c7806Roshan Piusvoid StaIface::invalidate() { is_valid_ = false; }
1064b527167fea5e519091442036c6c0fa0d03c7806Roshan Piusbool StaIface::isValid()
10754e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius{
1084b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return (is_valid_ && (retrieveIfacePtr() != nullptr));
1094b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius}
1107c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius
1114b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::getName(getName_cb _hidl_cb)
1124b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{
1134b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return validateAndCall(
1144b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
1154b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    &StaIface::getNameInternal, _hidl_cb);
11654e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius}
11754e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius
118bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan PiusReturn<void> StaIface::getType(getType_cb _hidl_cb)
119d6e375115b04e4ce30144a6a21ef4b1f8d3a0071Roshan Pius{
1204b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return validateAndCall(
1214b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
1224b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    &StaIface::getTypeInternal, _hidl_cb);
123bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius}
124bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius
125bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan PiusReturn<void> StaIface::addNetwork(addNetwork_cb _hidl_cb)
126bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius{
1274b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return validateAndCall(
1284b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
1294b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    &StaIface::addNetworkInternal, _hidl_cb);
1304b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius}
1314b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius
1324b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::removeNetwork(
1334b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius    SupplicantNetworkId id, removeNetwork_cb _hidl_cb)
1344b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{
1354b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return validateAndCall(
1364b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
1374b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    &StaIface::removeNetworkInternal, _hidl_cb, id);
1384b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius}
1394b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius
1404b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::getNetwork(
1414b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius    SupplicantNetworkId id, getNetwork_cb _hidl_cb)
1424b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{
1434b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return validateAndCall(
1444b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
1454b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    &StaIface::getNetworkInternal, _hidl_cb, id);
1464b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius}
1474b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius
1484b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::listNetworks(listNetworks_cb _hidl_cb)
1494b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{
1504b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return validateAndCall(
1514b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
1524b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    &StaIface::listNetworksInternal, _hidl_cb);
1534b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius}
1544b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius
1554b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::registerCallback(
1564b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius    const sp<ISupplicantStaIfaceCallback> &callback,
1574b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius    registerCallback_cb _hidl_cb)
1584b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{
1594b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return validateAndCall(
1604b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
1614b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    &StaIface::registerCallbackInternal, _hidl_cb, callback);
1624b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius}
1634b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius
1644b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::reassociate(reassociate_cb _hidl_cb)
1654b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{
1664b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return validateAndCall(
1674b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
1684b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    &StaIface::reassociateInternal, _hidl_cb);
1694b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius}
1704b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius
1714b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::reconnect(reconnect_cb _hidl_cb)
1724b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{
1734b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return validateAndCall(
1744b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
1754b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    &StaIface::reconnectInternal, _hidl_cb);
1764b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius}
1774b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius
1784b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::disconnect(disconnect_cb _hidl_cb)
1794b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{
1804b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return validateAndCall(
1814b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
1824b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    &StaIface::disconnectInternal, _hidl_cb);
1834b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius}
1844b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius
1854b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::setPowerSave(bool enable, setPowerSave_cb _hidl_cb)
1864b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{
1874b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return validateAndCall(
1884b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
1894b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    &StaIface::setPowerSaveInternal, _hidl_cb, enable);
1904b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius}
1914b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius
1924b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::initiateTdlsDiscover(
1934b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius    const hidl_array<uint8_t, 6> &mac_address, initiateTdlsDiscover_cb _hidl_cb)
1944b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{
1954b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return validateAndCall(
1964b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
1974b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    &StaIface::initiateTdlsDiscoverInternal, _hidl_cb, mac_address);
1984b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius}
1994b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius
2004b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::initiateTdlsSetup(
2014b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius    const hidl_array<uint8_t, 6> &mac_address, initiateTdlsSetup_cb _hidl_cb)
2024b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{
2034b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return validateAndCall(
2044b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
2054b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    &StaIface::initiateTdlsSetupInternal, _hidl_cb, mac_address);
2064b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius}
2074b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius
2084b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::initiateTdlsTeardown(
2094b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius    const hidl_array<uint8_t, 6> &mac_address, initiateTdlsTeardown_cb _hidl_cb)
2104b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{
2114b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return validateAndCall(
2124b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
2134b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	    &StaIface::initiateTdlsTeardownInternal, _hidl_cb, mac_address);
2144b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius}
215802517d19b6192b17c81e7ccbd036f8d2115433aRoshan PiusReturn<void> StaIface::initiateAnqpQuery(
216802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius    const hidl_array<uint8_t, 6> &mac_address,
217802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius    const hidl_vec<ISupplicantStaIface::AnqpInfoId> &info_elements,
218802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius    const hidl_vec<ISupplicantStaIface::Hs20AnqpSubtypes> &sub_types,
219802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius    initiateAnqpQuery_cb _hidl_cb)
220802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius{
221802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius	return validateAndCall(
222802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
223802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius	    &StaIface::initiateAnqpQueryInternal, _hidl_cb, mac_address,
224802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius	    info_elements, sub_types);
225802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius}
226802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius
227802517d19b6192b17c81e7ccbd036f8d2115433aRoshan PiusReturn<void> StaIface::initiateHs20IconQuery(
228802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius    const hidl_array<uint8_t, 6> &mac_address, const hidl_string &file_name,
229802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius    initiateHs20IconQuery_cb _hidl_cb)
230802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius{
231802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius	return validateAndCall(
232802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
233802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius	    &StaIface::initiateHs20IconQueryInternal, _hidl_cb, mac_address,
234802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius	    file_name);
235802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius}
2364b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius
2373599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusReturn<void> StaIface::getMacAddress(getMacAddress_cb _hidl_cb)
2383599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
2393599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return validateAndCall(
2403599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
2413599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    &StaIface::getMacAddressInternal, _hidl_cb);
2423599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
2433599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
2443599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusReturn<void> StaIface::startRxFilter(startRxFilter_cb _hidl_cb)
2453599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
2463599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return validateAndCall(
2473599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
2483599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    &StaIface::startRxFilterInternal, _hidl_cb);
2493599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
2503599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
2513599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusReturn<void> StaIface::stopRxFilter(stopRxFilter_cb _hidl_cb)
2523599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
2533599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return validateAndCall(
2543599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
2553599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    &StaIface::stopRxFilterInternal, _hidl_cb);
2563599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
2573599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
2583599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusReturn<void> StaIface::addRxFilter(
2593599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    ISupplicantStaIface::RxFilterType type, addRxFilter_cb _hidl_cb)
2603599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
2613599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return validateAndCall(
2623599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
2633599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    &StaIface::addRxFilterInternal, _hidl_cb, type);
2643599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
2653599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
2663599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusReturn<void> StaIface::removeRxFilter(
2673599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    ISupplicantStaIface::RxFilterType type, removeRxFilter_cb _hidl_cb)
2683599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
2693599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return validateAndCall(
2703599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
2713599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    &StaIface::removeRxFilterInternal, _hidl_cb, type);
2723599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
2733599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
2743599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusReturn<void> StaIface::setBtCoexistenceMode(
2753599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    ISupplicantStaIface::BtCoexistenceMode mode,
2763599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    setBtCoexistenceMode_cb _hidl_cb)
2773599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
2783599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return validateAndCall(
2793599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
2803599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    &StaIface::setBtCoexistenceModeInternal, _hidl_cb, mode);
2813599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
2823599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
2833599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusReturn<void> StaIface::setBtCoexistenceScanModeEnabled(
2843599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    bool enable, setBtCoexistenceScanModeEnabled_cb _hidl_cb)
2853599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
2863599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return validateAndCall(
2873599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
2883599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    &StaIface::setBtCoexistenceScanModeEnabledInternal, _hidl_cb,
2893599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    enable);
2903599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
2913599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
2923599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusReturn<void> StaIface::setSuspendModeEnabled(
2933599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    bool enable, setSuspendModeEnabled_cb _hidl_cb)
2943599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
2953599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return validateAndCall(
2963599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
2973599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    &StaIface::setSuspendModeEnabledInternal, _hidl_cb, enable);
2983599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
2993599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
3003599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusReturn<void> StaIface::setCountryCode(
3013599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    const hidl_array<int8_t, 2> &code, setCountryCode_cb _hidl_cb)
3023599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
3033599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return validateAndCall(
3043599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
3053599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    &StaIface::setCountryCodeInternal, _hidl_cb, code);
3063599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
3073599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
3084b527167fea5e519091442036c6c0fa0d03c7806Roshan Piusstd::pair<SupplicantStatus, std::string> StaIface::getNameInternal()
3094b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{
3104b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return {{SupplicantStatusCode::SUCCESS, ""}, ifname_};
3114b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius}
3124b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius
3134b527167fea5e519091442036c6c0fa0d03c7806Roshan Piusstd::pair<SupplicantStatus, IfaceType> StaIface::getTypeInternal()
3144b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{
3154b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return {{SupplicantStatusCode::SUCCESS, ""}, IfaceType::STA};
3164b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius}
3174b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius
3184b527167fea5e519091442036c6c0fa0d03c7806Roshan Piusstd::pair<SupplicantStatus, sp<ISupplicantNetwork>>
3194b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusStaIface::addNetworkInternal()
3204b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{
321bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius	android::sp<ISupplicantStaNetwork> network;
322d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
323f745df8121ceec43d19edba801ab7b3d1c689a2aRoshan Pius	struct wpa_ssid *ssid = wpa_supplicant_add_network(wpa_s);
324d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius	if (!ssid) {
3254b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, network};
326d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius	}
32757ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius	HidlManager *hidl_manager = HidlManager::getInstance();
32857ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius	if (!hidl_manager ||
329bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius	    hidl_manager->getStaNetworkHidlObjectByIfnameAndNetworkId(
3307c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius		wpa_s->ifname, ssid->id, &network)) {
3314b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, network};
332d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius	}
3334b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return {{SupplicantStatusCode::SUCCESS, ""}, network};
334d6e375115b04e4ce30144a6a21ef4b1f8d3a0071Roshan Pius}
335d6e375115b04e4ce30144a6a21ef4b1f8d3a0071Roshan Pius
3364b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::removeNetworkInternal(SupplicantNetworkId id)
337d6e375115b04e4ce30144a6a21ef4b1f8d3a0071Roshan Pius{
338d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
3397c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius	int result = wpa_supplicant_remove_network(wpa_s, id);
340f745df8121ceec43d19edba801ab7b3d1c689a2aRoshan Pius	if (result == -1) {
3414b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {SupplicantStatusCode::FAILURE_NETWORK_UNKNOWN, ""};
342d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius	}
3437c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius	if (result != 0) {
3444b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {SupplicantStatusCode::FAILURE_UNKNOWN, ""};
345d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius	}
3464b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
347d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius}
348d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius
3494b527167fea5e519091442036c6c0fa0d03c7806Roshan Piusstd::pair<SupplicantStatus, sp<ISupplicantNetwork>>
3504b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusStaIface::getNetworkInternal(SupplicantNetworkId id)
351d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius{
352bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius	android::sp<ISupplicantStaNetwork> network;
353d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
3547c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius	struct wpa_ssid *ssid = wpa_config_get_network(wpa_s->conf, id);
355d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius	if (!ssid) {
3564b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {{SupplicantStatusCode::FAILURE_NETWORK_UNKNOWN, ""},
3574b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius			network};
358d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius	}
35957ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius	HidlManager *hidl_manager = HidlManager::getInstance();
36057ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius	if (!hidl_manager ||
361bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius	    hidl_manager->getStaNetworkHidlObjectByIfnameAndNetworkId(
3627c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius		wpa_s->ifname, ssid->id, &network)) {
3634b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, network};
3647c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius	}
3654b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return {{SupplicantStatusCode::SUCCESS, ""}, network};
3667c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius}
3677c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius
3684b527167fea5e519091442036c6c0fa0d03c7806Roshan Piusstd::pair<SupplicantStatus, std::vector<SupplicantNetworkId>>
3694b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusStaIface::listNetworksInternal()
3707c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius{
3714b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	std::vector<SupplicantNetworkId> network_ids;
3727c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
3737c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius	for (struct wpa_ssid *wpa_ssid = wpa_s->conf->ssid; wpa_ssid;
3747c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius	     wpa_ssid = wpa_ssid->next) {
3757c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius		network_ids.emplace_back(wpa_ssid->id);
3767c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius	}
3774b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return {{SupplicantStatusCode::SUCCESS, ""}, std::move(network_ids)};
378d6e375115b04e4ce30144a6a21ef4b1f8d3a0071Roshan Pius}
379d6e375115b04e4ce30144a6a21ef4b1f8d3a0071Roshan Pius
3804b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::registerCallbackInternal(
3814b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius    const sp<ISupplicantStaIfaceCallback> &callback)
3820470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius{
38357ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius	HidlManager *hidl_manager = HidlManager::getInstance();
38457ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius	if (!hidl_manager ||
385bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius	    hidl_manager->addStaIfaceCallbackHidlObject(ifname_, callback)) {
3864b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {SupplicantStatusCode::FAILURE_UNKNOWN, ""};
3870470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius	}
3884b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
3890470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius}
3900470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius
3914b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::reassociateInternal()
392f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius{
393f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
394f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius	if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) {
3954b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {SupplicantStatusCode::FAILURE_IFACE_DISABLED, ""};
396f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius	}
3974b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	wpas_request_connection(wpa_s);
3984b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
399f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius}
400f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius
4014b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::reconnectInternal()
402f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius{
403f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
404f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius	if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) {
4054b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {SupplicantStatusCode::FAILURE_IFACE_DISABLED, ""};
406f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius	}
407f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius	if (!wpa_s->disconnected) {
4084b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {SupplicantStatusCode::FAILURE_IFACE_NOT_DISCONNECTED,
4094b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius			""};
410f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius	}
411f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius	wpas_request_connection(wpa_s);
4124b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
413f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius}
414f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius
4154b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::disconnectInternal()
416f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius{
417f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
418f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius	if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) {
4194b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {SupplicantStatusCode::FAILURE_IFACE_DISABLED, ""};
420f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius	}
421f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius	wpas_request_disconnection(wpa_s);
4224b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
423f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius}
424f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius
4254b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::setPowerSaveInternal(bool enable)
426390ba2881ef621db480848b7e50b93d61542206aRoshan Pius{
427390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
4284b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) {
4294b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {SupplicantStatusCode::FAILURE_IFACE_DISABLED, ""};
4307c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius	}
431390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	if (wpa_drv_set_p2p_powersave(wpa_s, enable, -1, -1)) {
4324b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {SupplicantStatusCode::FAILURE_UNKNOWN, ""};
433390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	}
4344b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
435390ba2881ef621db480848b7e50b93d61542206aRoshan Pius}
436390ba2881ef621db480848b7e50b93d61542206aRoshan Pius
4374b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::initiateTdlsDiscoverInternal(
4384b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius    const std::array<uint8_t, 6> &mac_address)
439390ba2881ef621db480848b7e50b93d61542206aRoshan Pius{
440390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
441390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	int ret;
442390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	const u8 *peer = mac_address.data();
443390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	if (wpa_tdls_is_external_setup(wpa_s->wpa)) {
444390ba2881ef621db480848b7e50b93d61542206aRoshan Pius		ret = wpa_tdls_send_discovery_request(wpa_s->wpa, peer);
445390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	} else {
446390ba2881ef621db480848b7e50b93d61542206aRoshan Pius		ret = wpa_drv_tdls_oper(wpa_s, TDLS_DISCOVERY_REQ, peer);
447390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	}
448390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	if (ret) {
4494b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {SupplicantStatusCode::FAILURE_UNKNOWN, ""};
450390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	}
4514b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
452390ba2881ef621db480848b7e50b93d61542206aRoshan Pius}
453390ba2881ef621db480848b7e50b93d61542206aRoshan Pius
4544b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::initiateTdlsSetupInternal(
4554b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius    const std::array<uint8_t, 6> &mac_address)
456390ba2881ef621db480848b7e50b93d61542206aRoshan Pius{
457390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
458390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	int ret;
459390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	const u8 *peer = mac_address.data();
460390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	if (wpa_tdls_is_external_setup(wpa_s->wpa) &&
461390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	    !(wpa_s->conf->tdls_external_control)) {
462390ba2881ef621db480848b7e50b93d61542206aRoshan Pius		wpa_tdls_remove(wpa_s->wpa, peer);
463390ba2881ef621db480848b7e50b93d61542206aRoshan Pius		ret = wpa_tdls_start(wpa_s->wpa, peer);
464390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	} else {
465390ba2881ef621db480848b7e50b93d61542206aRoshan Pius		ret = wpa_drv_tdls_oper(wpa_s, TDLS_SETUP, peer);
466390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	}
467390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	if (ret) {
4684b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {SupplicantStatusCode::FAILURE_UNKNOWN, ""};
469390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	}
4704b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
471390ba2881ef621db480848b7e50b93d61542206aRoshan Pius}
472390ba2881ef621db480848b7e50b93d61542206aRoshan Pius
4734b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::initiateTdlsTeardownInternal(
4744b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius    const std::array<uint8_t, 6> &mac_address)
475390ba2881ef621db480848b7e50b93d61542206aRoshan Pius{
476390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
477390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	int ret;
478390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	const u8 *peer = mac_address.data();
479390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	if (wpa_tdls_is_external_setup(wpa_s->wpa) &&
480390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	    !(wpa_s->conf->tdls_external_control)) {
481390ba2881ef621db480848b7e50b93d61542206aRoshan Pius		ret = wpa_tdls_teardown_link(
482390ba2881ef621db480848b7e50b93d61542206aRoshan Pius		    wpa_s->wpa, peer, WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED);
483390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	} else {
484390ba2881ef621db480848b7e50b93d61542206aRoshan Pius		ret = wpa_drv_tdls_oper(wpa_s, TDLS_TEARDOWN, peer);
485390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	}
486390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	if (ret) {
4874b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius		return {SupplicantStatusCode::FAILURE_UNKNOWN, ""};
488390ba2881ef621db480848b7e50b93d61542206aRoshan Pius	}
4894b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
490390ba2881ef621db480848b7e50b93d61542206aRoshan Pius}
491390ba2881ef621db480848b7e50b93d61542206aRoshan Pius
492802517d19b6192b17c81e7ccbd036f8d2115433aRoshan PiusSupplicantStatus StaIface::initiateAnqpQueryInternal(
493802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius    const std::array<uint8_t, 6> &mac_address,
494802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius    const std::vector<ISupplicantStaIface::AnqpInfoId> &info_elements,
495802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius    const std::vector<ISupplicantStaIface::Hs20AnqpSubtypes> &sub_types)
496802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius{
49708f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
49808f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	if (info_elements.size() > kMaxAnqpElems) {
49908f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius		return {SupplicantStatusCode::FAILURE_ARGS_INVALID, ""};
50008f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	}
50108f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	uint16_t *info_elems_buf = static_cast<uint16_t *>(
50208f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	    os_malloc(sizeof(uint16_t) * info_elements.size()));
50308f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	if (!info_elems_buf) {
50408f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius		return {SupplicantStatusCode::FAILURE_UNKNOWN, ""};
50508f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	}
50608f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	uint32_t num_info_elems = 0;
50708f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	for (const auto &info_element : info_elements) {
50808f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius		info_elems_buf[num_info_elems++] =
50908f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius		    static_cast<std::underlying_type<
51008f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius			ISupplicantStaIface::AnqpInfoId>::type>(info_element);
51108f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	}
51208f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	uint32_t sub_types_bitmask = 0;
51308f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	for (const auto &type : sub_types) {
51408f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius		sub_types_bitmask |= BIT(
51508f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius		    static_cast<std::underlying_type<
51608f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius			ISupplicantStaIface::Hs20AnqpSubtypes>::type>(type));
51708f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	}
51808f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	if (anqp_send_req(
51908f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius		wpa_s, mac_address.data(), info_elems_buf, num_info_elems,
52008f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius		sub_types_bitmask, false)) {
52108f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius		return {SupplicantStatusCode::FAILURE_UNKNOWN, ""};
52208f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	}
523802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
524802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius}
525802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius
526802517d19b6192b17c81e7ccbd036f8d2115433aRoshan PiusSupplicantStatus StaIface::initiateHs20IconQueryInternal(
527802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius    const std::array<uint8_t, 6> &mac_address, const std::string &file_name)
528802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius{
52908f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
53008f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	wpa_s->fetch_osu_icon_in_progress = 0;
53108f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	if (hs20_anqp_send_req(
53208f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius		wpa_s, mac_address.data(), BIT(HS20_STYPE_ICON_REQUEST),
53308f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius		reinterpret_cast<const uint8_t *>(file_name.c_str()),
53408f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius		file_name.size(), true)) {
53508f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius		return {SupplicantStatusCode::FAILURE_UNKNOWN, ""};
53608f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	}
537802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
538802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius}
539802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius
5403599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusstd::pair<SupplicantStatus, std::array<uint8_t, 6>>
5413599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusStaIface::getMacAddressInternal()
5423599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
5433599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
5443599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	std::vector<char> cmd(
5453599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    kGetMacAddress, kGetMacAddress + sizeof(kGetMacAddress));
5463599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	char driver_cmd_reply_buf[4096] = {};
5473599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	int ret = wpa_drv_driver_cmd(
5483599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    wpa_s, cmd.data(), driver_cmd_reply_buf,
5493599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    sizeof(driver_cmd_reply_buf));
5503599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	// Reply is of the format: "Macaddr = XX:XX:XX:XX:XX:XX"
5513599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	std::string reply_str = driver_cmd_reply_buf;
5523599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	if (ret || reply_str.empty() ||
5533599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    reply_str.find("=") == std::string::npos) {
5543599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, {}};
5553599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	}
5563599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	// Remove all whitespace first and then split using the delimiter "=".
5573599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	reply_str.erase(
5583599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    remove_if(reply_str.begin(), reply_str.end(), isspace),
5593599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    reply_str.end());
5603599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	std::string mac_addr_str =
5613599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    reply_str.substr(reply_str.find("=") + 1, reply_str.size());
5623599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	std::array<uint8_t, 6> mac_addr;
5633599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	if (hwaddr_aton(mac_addr_str.c_str(), mac_addr.data())) {
5643599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, {}};
5653599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	}
5663599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return {{SupplicantStatusCode::SUCCESS, ""}, mac_addr};
5673599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
5683599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
5693599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::startRxFilterInternal()
5703599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
5713599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return doZeroArgDriverCommand(retrieveIfacePtr(), kStartRxFilter);
5723599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
5733599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
5743599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::stopRxFilterInternal()
5753599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
5763599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return doZeroArgDriverCommand(retrieveIfacePtr(), kStopRxFilter);
5773599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
5783599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
5793599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::addRxFilterInternal(
5803599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    ISupplicantStaIface::RxFilterType type)
5813599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
5823599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return doOneArgDriverCommand(
5833599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    retrieveIfacePtr(), kAddRxFilter,
5843599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    convertHidlRxFilterTypeToInternal(type));
5853599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
5863599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
5873599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::removeRxFilterInternal(
5883599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    ISupplicantStaIface::RxFilterType type)
5893599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
5903599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return doOneArgDriverCommand(
5913599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    retrieveIfacePtr(), kRemoveRxFilter,
5923599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    convertHidlRxFilterTypeToInternal(type));
5933599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
5943599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
5953599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::setBtCoexistenceModeInternal(
5963599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    ISupplicantStaIface::BtCoexistenceMode mode)
5973599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
5983599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return doOneArgDriverCommand(
5993599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    retrieveIfacePtr(), kSetBtCoexistenceMode,
6003599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    convertHidlBtCoexModeToInternal(mode));
6013599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
6023599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
6033599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::setBtCoexistenceScanModeEnabledInternal(bool enable)
6043599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
6053599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	const char *cmd;
6063599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	if (enable) {
6073599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		cmd = kSetBtCoexistenceScanStart;
6083599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	} else {
6093599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		cmd = kSetBtCoexistenceScanStop;
6103599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	}
6113599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return doZeroArgDriverCommand(retrieveIfacePtr(), cmd);
6123599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
6133599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
6143599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::setSuspendModeEnabledInternal(bool enable)
6153599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
6163599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	const char *cmd;
6173599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	if (enable) {
6183599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		cmd = kSetSupendModeEnabled;
6193599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	} else {
6203599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		cmd = kSetSupendModeDisabled;
6213599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	}
6223599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return doZeroArgDriverCommand(retrieveIfacePtr(), cmd);
6233599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
6243599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
6253599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::setCountryCodeInternal(
6263599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius    const std::array<int8_t, 2> &code)
6273599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{
6283599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	struct wpa_supplicant *wpa_s = retrieveIfacePtr();
6293599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	SupplicantStatus status = doOneArgDriverCommand(
6303599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    wpa_s, kSetCountryCode,
6313599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	    std::string(std::begin(code), std::end(code)));
6323599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	if (status.code != SupplicantStatusCode::SUCCESS) {
6333599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		return status;
6343599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	}
6353599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	struct p2p_data *p2p = wpa_s->global->p2p;
6363599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	if (p2p) {
6373599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		char country[3];
6383599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		country[0] = code[0];
6393599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		country[1] = code[1];
6403599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		country[2] = 0x04;
6413599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius		p2p_set_country(p2p, country);
6423599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	}
6433599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius	return {SupplicantStatusCode::SUCCESS, ""};
6443599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius}
6453599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius
64654e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius/**
6477c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius * Retrieve the underlying |wpa_supplicant| struct
6487c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius * pointer for this iface.
6497c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius * If the underlying iface is removed, then all RPC method calls on this object
6507c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius * will return failure.
65154e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius */
652bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Piuswpa_supplicant *StaIface::retrieveIfacePtr()
65354e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius{
65408f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius	return wpa_supplicant_get_iface(wpa_global_, ifname_.c_str());
65554e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius}
6567c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius}  // namespace implementation
6577c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius}  // namespace V1_0
6587c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius}  // namespace wifi
6597c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius}  // namespace supplicant
6607c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius}  // namespace hardware
6617c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius}  // namespace android
662