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" 13235f7da827f7236c90f837b5604a026d3f61b8a1Roshan Pius#include "misc_utils.h" 14bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius#include "sta_iface.h" 15e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 1608f74c46f8051414c23a837b68edfd507202f3f7Roshan Piusextern "C" { 1794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius#include "utils/eloop.h" 1808f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius#include "gas_query.h" 1908f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius#include "interworking.h" 2008f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius#include "hs20_supplicant.h" 21149327590e009d96301e69772e717e227215d5acRoshan Pius#include "wps_supplicant.h" 2208f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius} 2308f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius 2408f74c46f8051414c23a837b68edfd507202f3f7Roshan Piusnamespace { 2594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Piususing android::hardware::wifi::supplicant::V1_0::ISupplicantStaIface; 2694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Piususing android::hardware::wifi::supplicant::V1_0::SupplicantStatus; 2794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Piususing android::hardware::wifi::supplicant::V1_0::SupplicantStatusCode; 2894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Piususing android::hardware::wifi::supplicant::V1_0::implementation::HidlManager; 2994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 3008f74c46f8051414c23a837b68edfd507202f3f7Roshan Piusconstexpr uint32_t kMaxAnqpElems = 100; 313599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kGetMacAddress[] = "MACADDR"; 323599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kStartRxFilter[] = "RXFILTER-START"; 333599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kStopRxFilter[] = "RXFILTER-STOP"; 343599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kAddRxFilter[] = "RXFILTER-ADD"; 353599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kRemoveRxFilter[] = "RXFILTER-REMOVE"; 363599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kSetBtCoexistenceMode[] = "BTCOEXMODE"; 373599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kSetBtCoexistenceScanStart[] = "BTCOEXSCAN-START"; 383599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kSetBtCoexistenceScanStop[] = "BTCOEXSCAN-STOP"; 393599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kSetSupendModeEnabled[] = "SETSUSPENDMODE 1"; 403599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusconstexpr char kSetSupendModeDisabled[] = "SETSUSPENDMODE 0"; 411295dfb961a5dc5186ebc58753cf82eaba16e51fRoshan Piusconstexpr char kSetCountryCode[] = "COUNTRY"; 4294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Piusconstexpr uint32_t kExtRadioWorkDefaultTimeoutInSec = static_cast<uint32_t>( 4394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius ISupplicantStaIface::ExtRadioWorkDefaults::TIMEOUT_IN_SECS); 4494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Piusconstexpr char kExtRadioWorkNamePrefix[] = "ext:"; 453599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 463599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusuint8_t convertHidlRxFilterTypeToInternal( 473599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius ISupplicantStaIface::RxFilterType type) 483599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 493599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius switch (type) { 503599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius case ISupplicantStaIface::RxFilterType::V4_MULTICAST: 513599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return 2; 523599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius case ISupplicantStaIface::RxFilterType::V6_MULTICAST: 533599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return 3; 543599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius }; 553599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius WPA_ASSERT(false); 563599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 573599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 583599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusuint8_t convertHidlBtCoexModeToInternal( 593599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius ISupplicantStaIface::BtCoexistenceMode mode) 603599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 613599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius switch (mode) { 623599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius case ISupplicantStaIface::BtCoexistenceMode::ENABLED: 633599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return 0; 643599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius case ISupplicantStaIface::BtCoexistenceMode::DISABLED: 653599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return 1; 663599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius case ISupplicantStaIface::BtCoexistenceMode::SENSE: 673599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return 2; 683599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius }; 693599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius WPA_ASSERT(false); 703599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 713599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 723599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus doZeroArgDriverCommand( 733599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius struct wpa_supplicant *wpa_s, const char *cmd) 743599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 753599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius std::vector<char> cmd_vec(cmd, cmd + strlen(cmd) + 1); 763599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius char driver_cmd_reply_buf[4096] = {}; 773599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius if (wpa_drv_driver_cmd( 783599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius wpa_s, cmd_vec.data(), driver_cmd_reply_buf, 793599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius sizeof(driver_cmd_reply_buf))) { 803599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return {SupplicantStatusCode::FAILURE_UNKNOWN, ""}; 813599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius } 823599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 833599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 843599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 853599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus doOneArgDriverCommand( 863599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius struct wpa_supplicant *wpa_s, const char *cmd, uint8_t arg) 873599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 883599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius std::string cmd_str = std::string(cmd) + " " + std::to_string(arg); 893599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return doZeroArgDriverCommand(wpa_s, cmd_str.c_str()); 903599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 913599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 923599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus doOneArgDriverCommand( 933599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius struct wpa_supplicant *wpa_s, const char *cmd, const std::string &arg) 943599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 953599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius std::string cmd_str = std::string(cmd) + " " + arg; 963599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return doZeroArgDriverCommand(wpa_s, cmd_str.c_str()); 973599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 9894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 9994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Piusvoid endExtRadioWork(struct wpa_radio_work *work) 10094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{ 10194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius auto *ework = static_cast<struct wpa_external_work *>(work->ctx); 10294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius work->wpa_s->ext_work_in_progress = 0; 10394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius radio_work_done(work); 10494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius os_free(ework); 10594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius} 10694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 10794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Piusvoid extRadioWorkTimeoutCb(void *eloop_ctx, void *timeout_ctx) 10894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{ 10994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius auto *work = static_cast<struct wpa_radio_work *>(eloop_ctx); 11094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius auto *ework = static_cast<struct wpa_external_work *>(work->ctx); 11194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius wpa_dbg( 11294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius work->wpa_s, MSG_DEBUG, "Timing out external radio work %u (%s)", 11394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius ework->id, work->type); 11494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 11594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius HidlManager *hidl_manager = HidlManager::getInstance(); 11694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius WPA_ASSERT(hidl_manager); 11794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius hidl_manager->notifyExtRadioWorkTimeout(work->wpa_s, ework->id); 11894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 11994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius endExtRadioWork(work); 12094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius} 12194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 12294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Piusvoid startExtRadioWork(struct wpa_radio_work *work) 12394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{ 12494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius auto *ework = static_cast<struct wpa_external_work *>(work->ctx); 12594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius work->wpa_s->ext_work_in_progress = 1; 12694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius if (!ework->timeout) { 12794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius ework->timeout = kExtRadioWorkDefaultTimeoutInSec; 12894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius } 12994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius eloop_register_timeout( 13094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius ework->timeout, 0, extRadioWorkTimeoutCb, work, nullptr); 13194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius} 13294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 13394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Piusvoid extRadioWorkStartCb(struct wpa_radio_work *work, int deinit) 13494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{ 13594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius // deinit==1 is invoked during interface removal. Since the HIDL 13694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius // interface does not support interface addition/removal, we don't 13794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius // need to handle this scenario. 13894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius WPA_ASSERT(!deinit); 13994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 14094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius auto *ework = static_cast<struct wpa_external_work *>(work->ctx); 14194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius wpa_dbg( 14294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius work->wpa_s, MSG_DEBUG, "Starting external radio work %u (%s)", 14394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius ework->id, ework->type); 14494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 14594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius HidlManager *hidl_manager = HidlManager::getInstance(); 14694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius WPA_ASSERT(hidl_manager); 14794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius hidl_manager->notifyExtRadioWorkStart(work->wpa_s, ework->id); 14894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 14994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius startExtRadioWork(work); 15094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius} 15194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 15208f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius} // namespace 15308f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius 1547c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace android { 1557c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace hardware { 1567c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace wifi { 1577c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace supplicant { 1587c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace V1_0 { 1597c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace implementation { 1604b527167fea5e519091442036c6c0fa0d03c7806Roshan Piususing hidl_return_util::validateAndCall; 1618702ba9091ab6dd6702afedb7021c1caa277f8d4Roshan Pius 162bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan PiusStaIface::StaIface(struct wpa_global *wpa_global, const char ifname[]) 1634b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius : wpa_global_(wpa_global), ifname_(ifname), is_valid_(true) 16454e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius{ 16554e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius} 166e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 1674b527167fea5e519091442036c6c0fa0d03c7806Roshan Piusvoid StaIface::invalidate() { is_valid_ = false; } 1684b527167fea5e519091442036c6c0fa0d03c7806Roshan Piusbool StaIface::isValid() 16954e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius{ 1704b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return (is_valid_ && (retrieveIfacePtr() != nullptr)); 1714b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius} 1727c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius 1734b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::getName(getName_cb _hidl_cb) 1744b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{ 1754b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return validateAndCall( 1764b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 1774b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius &StaIface::getNameInternal, _hidl_cb); 17854e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius} 17954e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius 180bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan PiusReturn<void> StaIface::getType(getType_cb _hidl_cb) 181d6e375115b04e4ce30144a6a21ef4b1f8d3a0071Roshan Pius{ 1824b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return validateAndCall( 1834b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 1844b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius &StaIface::getTypeInternal, _hidl_cb); 185bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius} 186bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius 187bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan PiusReturn<void> StaIface::addNetwork(addNetwork_cb _hidl_cb) 188bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius{ 1894b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return validateAndCall( 1904b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 1914b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius &StaIface::addNetworkInternal, _hidl_cb); 1924b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius} 1934b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius 1944b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::removeNetwork( 1954b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius SupplicantNetworkId id, removeNetwork_cb _hidl_cb) 1964b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{ 1974b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return validateAndCall( 1984b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 1994b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius &StaIface::removeNetworkInternal, _hidl_cb, id); 2004b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius} 2014b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius 2024b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::getNetwork( 2034b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius SupplicantNetworkId id, getNetwork_cb _hidl_cb) 2044b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{ 2054b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return validateAndCall( 2064b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 2074b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius &StaIface::getNetworkInternal, _hidl_cb, id); 2084b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius} 2094b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius 2104b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::listNetworks(listNetworks_cb _hidl_cb) 2114b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{ 2124b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return validateAndCall( 2134b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 2144b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius &StaIface::listNetworksInternal, _hidl_cb); 2154b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius} 2164b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius 2174b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::registerCallback( 2184b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius const sp<ISupplicantStaIfaceCallback> &callback, 2194b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius registerCallback_cb _hidl_cb) 2204b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{ 2214b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return validateAndCall( 2224b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 2234b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius &StaIface::registerCallbackInternal, _hidl_cb, callback); 2244b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius} 2254b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius 2264b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::reassociate(reassociate_cb _hidl_cb) 2274b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{ 2284b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return validateAndCall( 2294b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 2304b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius &StaIface::reassociateInternal, _hidl_cb); 2314b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius} 2324b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius 2334b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::reconnect(reconnect_cb _hidl_cb) 2344b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{ 2354b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return validateAndCall( 2364b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 2374b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius &StaIface::reconnectInternal, _hidl_cb); 2384b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius} 2394b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius 2404b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::disconnect(disconnect_cb _hidl_cb) 2414b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{ 2424b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return validateAndCall( 2434b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 2444b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius &StaIface::disconnectInternal, _hidl_cb); 2454b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius} 2464b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius 2474b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::setPowerSave(bool enable, setPowerSave_cb _hidl_cb) 2484b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{ 2494b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return validateAndCall( 2504b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 2514b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius &StaIface::setPowerSaveInternal, _hidl_cb, enable); 2524b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius} 2534b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius 2544b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::initiateTdlsDiscover( 2554b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius const hidl_array<uint8_t, 6> &mac_address, initiateTdlsDiscover_cb _hidl_cb) 2564b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{ 2574b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return validateAndCall( 2584b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 2594b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius &StaIface::initiateTdlsDiscoverInternal, _hidl_cb, mac_address); 2604b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius} 2614b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius 2624b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::initiateTdlsSetup( 2634b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius const hidl_array<uint8_t, 6> &mac_address, initiateTdlsSetup_cb _hidl_cb) 2644b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{ 2654b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return validateAndCall( 2664b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 2674b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius &StaIface::initiateTdlsSetupInternal, _hidl_cb, mac_address); 2684b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius} 2694b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius 2704b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusReturn<void> StaIface::initiateTdlsTeardown( 2714b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius const hidl_array<uint8_t, 6> &mac_address, initiateTdlsTeardown_cb _hidl_cb) 2724b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{ 2734b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return validateAndCall( 2744b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 2754b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius &StaIface::initiateTdlsTeardownInternal, _hidl_cb, mac_address); 2764b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius} 277802517d19b6192b17c81e7ccbd036f8d2115433aRoshan PiusReturn<void> StaIface::initiateAnqpQuery( 278802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius const hidl_array<uint8_t, 6> &mac_address, 279802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius const hidl_vec<ISupplicantStaIface::AnqpInfoId> &info_elements, 280802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius const hidl_vec<ISupplicantStaIface::Hs20AnqpSubtypes> &sub_types, 281802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius initiateAnqpQuery_cb _hidl_cb) 282802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius{ 283802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius return validateAndCall( 284802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 285802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius &StaIface::initiateAnqpQueryInternal, _hidl_cb, mac_address, 286802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius info_elements, sub_types); 287802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius} 288802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius 289802517d19b6192b17c81e7ccbd036f8d2115433aRoshan PiusReturn<void> StaIface::initiateHs20IconQuery( 290802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius const hidl_array<uint8_t, 6> &mac_address, const hidl_string &file_name, 291802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius initiateHs20IconQuery_cb _hidl_cb) 292802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius{ 293802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius return validateAndCall( 294802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 295802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius &StaIface::initiateHs20IconQueryInternal, _hidl_cb, mac_address, 296802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius file_name); 297802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius} 2984b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius 2993599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusReturn<void> StaIface::getMacAddress(getMacAddress_cb _hidl_cb) 3003599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 3013599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return validateAndCall( 3023599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 3033599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius &StaIface::getMacAddressInternal, _hidl_cb); 3043599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 3053599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 3063599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusReturn<void> StaIface::startRxFilter(startRxFilter_cb _hidl_cb) 3073599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 3083599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return validateAndCall( 3093599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 3103599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius &StaIface::startRxFilterInternal, _hidl_cb); 3113599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 3123599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 3133599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusReturn<void> StaIface::stopRxFilter(stopRxFilter_cb _hidl_cb) 3143599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 3153599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return validateAndCall( 3163599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 3173599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius &StaIface::stopRxFilterInternal, _hidl_cb); 3183599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 3193599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 3203599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusReturn<void> StaIface::addRxFilter( 3213599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius ISupplicantStaIface::RxFilterType type, addRxFilter_cb _hidl_cb) 3223599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 3233599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return validateAndCall( 3243599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 3253599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius &StaIface::addRxFilterInternal, _hidl_cb, type); 3263599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 3273599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 3283599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusReturn<void> StaIface::removeRxFilter( 3293599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius ISupplicantStaIface::RxFilterType type, removeRxFilter_cb _hidl_cb) 3303599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 3313599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return validateAndCall( 3323599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 3333599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius &StaIface::removeRxFilterInternal, _hidl_cb, type); 3343599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 3353599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 3363599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusReturn<void> StaIface::setBtCoexistenceMode( 3373599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius ISupplicantStaIface::BtCoexistenceMode mode, 3383599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius setBtCoexistenceMode_cb _hidl_cb) 3393599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 3403599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return validateAndCall( 3413599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 3423599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius &StaIface::setBtCoexistenceModeInternal, _hidl_cb, mode); 3433599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 3443599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 3453599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusReturn<void> StaIface::setBtCoexistenceScanModeEnabled( 3463599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius bool enable, setBtCoexistenceScanModeEnabled_cb _hidl_cb) 3473599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 3483599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return validateAndCall( 3493599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 3503599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius &StaIface::setBtCoexistenceScanModeEnabledInternal, _hidl_cb, 3513599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius enable); 3523599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 3533599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 3543599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusReturn<void> StaIface::setSuspendModeEnabled( 3553599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius bool enable, setSuspendModeEnabled_cb _hidl_cb) 3563599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 3573599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return validateAndCall( 3583599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 3593599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius &StaIface::setSuspendModeEnabledInternal, _hidl_cb, enable); 3603599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 3613599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 3623599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusReturn<void> StaIface::setCountryCode( 3633599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius const hidl_array<int8_t, 2> &code, setCountryCode_cb _hidl_cb) 3643599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 3653599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return validateAndCall( 3663599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 3673599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius &StaIface::setCountryCodeInternal, _hidl_cb, code); 3683599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 3693599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 370149327590e009d96301e69772e717e227215d5acRoshan PiusReturn<void> StaIface::startWpsRegistrar( 371149327590e009d96301e69772e717e227215d5acRoshan Pius const hidl_array<uint8_t, 6> &bssid, const hidl_string &pin, 372149327590e009d96301e69772e717e227215d5acRoshan Pius startWpsRegistrar_cb _hidl_cb) 373149327590e009d96301e69772e717e227215d5acRoshan Pius{ 374149327590e009d96301e69772e717e227215d5acRoshan Pius return validateAndCall( 375149327590e009d96301e69772e717e227215d5acRoshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 376149327590e009d96301e69772e717e227215d5acRoshan Pius &StaIface::startWpsRegistrarInternal, _hidl_cb, bssid, pin); 377149327590e009d96301e69772e717e227215d5acRoshan Pius} 378149327590e009d96301e69772e717e227215d5acRoshan Pius 379149327590e009d96301e69772e717e227215d5acRoshan PiusReturn<void> StaIface::startWpsPbc( 380149327590e009d96301e69772e717e227215d5acRoshan Pius const hidl_array<uint8_t, 6> &bssid, startWpsPbc_cb _hidl_cb) 381149327590e009d96301e69772e717e227215d5acRoshan Pius{ 382149327590e009d96301e69772e717e227215d5acRoshan Pius return validateAndCall( 383149327590e009d96301e69772e717e227215d5acRoshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 384149327590e009d96301e69772e717e227215d5acRoshan Pius &StaIface::startWpsPbcInternal, _hidl_cb, bssid); 385149327590e009d96301e69772e717e227215d5acRoshan Pius} 386149327590e009d96301e69772e717e227215d5acRoshan Pius 387149327590e009d96301e69772e717e227215d5acRoshan PiusReturn<void> StaIface::startWpsPinKeypad( 388149327590e009d96301e69772e717e227215d5acRoshan Pius const hidl_string &pin, startWpsPinKeypad_cb _hidl_cb) 389149327590e009d96301e69772e717e227215d5acRoshan Pius{ 390149327590e009d96301e69772e717e227215d5acRoshan Pius return validateAndCall( 391149327590e009d96301e69772e717e227215d5acRoshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 392149327590e009d96301e69772e717e227215d5acRoshan Pius &StaIface::startWpsPinKeypadInternal, _hidl_cb, pin); 393149327590e009d96301e69772e717e227215d5acRoshan Pius} 394149327590e009d96301e69772e717e227215d5acRoshan Pius 395149327590e009d96301e69772e717e227215d5acRoshan PiusReturn<void> StaIface::startWpsPinDisplay( 396149327590e009d96301e69772e717e227215d5acRoshan Pius const hidl_array<uint8_t, 6> &bssid, startWpsPinDisplay_cb _hidl_cb) 397149327590e009d96301e69772e717e227215d5acRoshan Pius{ 398149327590e009d96301e69772e717e227215d5acRoshan Pius return validateAndCall( 399149327590e009d96301e69772e717e227215d5acRoshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 400149327590e009d96301e69772e717e227215d5acRoshan Pius &StaIface::startWpsPinDisplayInternal, _hidl_cb, bssid); 401149327590e009d96301e69772e717e227215d5acRoshan Pius} 402149327590e009d96301e69772e717e227215d5acRoshan Pius 403149327590e009d96301e69772e717e227215d5acRoshan PiusReturn<void> StaIface::cancelWps(cancelWps_cb _hidl_cb) 404149327590e009d96301e69772e717e227215d5acRoshan Pius{ 405149327590e009d96301e69772e717e227215d5acRoshan Pius return validateAndCall( 406149327590e009d96301e69772e717e227215d5acRoshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 407149327590e009d96301e69772e717e227215d5acRoshan Pius &StaIface::cancelWpsInternal, _hidl_cb); 408149327590e009d96301e69772e717e227215d5acRoshan Pius} 409149327590e009d96301e69772e717e227215d5acRoshan Pius 4106a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusReturn<void> StaIface::setWpsDeviceName( 4116a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius const hidl_string &name, setWpsDeviceName_cb _hidl_cb) 4126a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{ 4136a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return validateAndCall( 4146a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 4156a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius &StaIface::setWpsDeviceNameInternal, _hidl_cb, name); 4166a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} 4176a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 41894426e651275a0ef2261783b7eb13aa64012bbc8Roshan PiusReturn<void> StaIface::setWpsDeviceType( 41994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius const hidl_array<uint8_t, 8> &type, setWpsDeviceType_cb _hidl_cb) 42094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{ 42194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius return validateAndCall( 42294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 42394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius &StaIface::setWpsDeviceTypeInternal, _hidl_cb, type); 42494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius} 42594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 4266a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusReturn<void> StaIface::setWpsManufacturer( 4276a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius const hidl_string &manufacturer, setWpsManufacturer_cb _hidl_cb) 4286a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{ 4296a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return validateAndCall( 4306a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 4316a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius &StaIface::setWpsManufacturerInternal, _hidl_cb, manufacturer); 4326a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} 4336a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 4346a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusReturn<void> StaIface::setWpsModelName( 4356a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius const hidl_string &model_name, setWpsModelName_cb _hidl_cb) 4366a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{ 4376a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return validateAndCall( 4386a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 4396a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius &StaIface::setWpsModelNameInternal, _hidl_cb, model_name); 4406a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} 4416a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 4426a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusReturn<void> StaIface::setWpsModelNumber( 4436a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius const hidl_string &model_number, setWpsModelNumber_cb _hidl_cb) 4446a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{ 4456a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return validateAndCall( 4466a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 4476a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius &StaIface::setWpsModelNumberInternal, _hidl_cb, model_number); 4486a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} 4496a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 4506a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusReturn<void> StaIface::setWpsSerialNumber( 4516a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius const hidl_string &serial_number, setWpsSerialNumber_cb _hidl_cb) 4526a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{ 4536a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return validateAndCall( 4546a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 4556a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius &StaIface::setWpsSerialNumberInternal, _hidl_cb, serial_number); 4566a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} 4576a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 4586a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusReturn<void> StaIface::setWpsConfigMethods( 4596a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius uint16_t config_methods, setWpsConfigMethods_cb _hidl_cb) 4606a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{ 4616a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return validateAndCall( 4626a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 4636a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius &StaIface::setWpsConfigMethodsInternal, _hidl_cb, config_methods); 4646a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} 4656a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 4666a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusReturn<void> StaIface::setExternalSim( 4676a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius bool useExternalSim, setExternalSim_cb _hidl_cb) 4686a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{ 4696a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return validateAndCall( 4706a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 4716a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius &StaIface::setExternalSimInternal, _hidl_cb, useExternalSim); 4726a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} 4736a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 47494426e651275a0ef2261783b7eb13aa64012bbc8Roshan PiusReturn<void> StaIface::addExtRadioWork( 47594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius const hidl_string &name, uint32_t freq_in_mhz, uint32_t timeout_in_sec, 47694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius addExtRadioWork_cb _hidl_cb) 47794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{ 47894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius return validateAndCall( 47994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 48094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius &StaIface::addExtRadioWorkInternal, _hidl_cb, name, freq_in_mhz, 48194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius timeout_in_sec); 48294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius} 48394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 48494426e651275a0ef2261783b7eb13aa64012bbc8Roshan PiusReturn<void> StaIface::removeExtRadioWork( 48594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius uint32_t id, removeExtRadioWork_cb _hidl_cb) 48694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{ 48794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius return validateAndCall( 48894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 48994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius &StaIface::removeExtRadioWorkInternal, _hidl_cb, id); 49094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius} 49194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 4925712631c22c328fa5db65cec7575afaefbb2a720Roshan PiusReturn<void> StaIface::enableAutoReconnect( 4935712631c22c328fa5db65cec7575afaefbb2a720Roshan Pius bool enable, enableAutoReconnect_cb _hidl_cb) 4945712631c22c328fa5db65cec7575afaefbb2a720Roshan Pius{ 4955712631c22c328fa5db65cec7575afaefbb2a720Roshan Pius return validateAndCall( 4965712631c22c328fa5db65cec7575afaefbb2a720Roshan Pius this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 4975712631c22c328fa5db65cec7575afaefbb2a720Roshan Pius &StaIface::enableAutoReconnectInternal, _hidl_cb, enable); 4985712631c22c328fa5db65cec7575afaefbb2a720Roshan Pius} 4995712631c22c328fa5db65cec7575afaefbb2a720Roshan Pius 5004b527167fea5e519091442036c6c0fa0d03c7806Roshan Piusstd::pair<SupplicantStatus, std::string> StaIface::getNameInternal() 5014b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{ 5024b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {{SupplicantStatusCode::SUCCESS, ""}, ifname_}; 5034b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius} 5044b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius 5054b527167fea5e519091442036c6c0fa0d03c7806Roshan Piusstd::pair<SupplicantStatus, IfaceType> StaIface::getTypeInternal() 5064b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{ 5074b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {{SupplicantStatusCode::SUCCESS, ""}, IfaceType::STA}; 5084b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius} 5094b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius 5104b527167fea5e519091442036c6c0fa0d03c7806Roshan Piusstd::pair<SupplicantStatus, sp<ISupplicantNetwork>> 5114b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusStaIface::addNetworkInternal() 5124b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{ 513bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius android::sp<ISupplicantStaNetwork> network; 514d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 515f745df8121ceec43d19edba801ab7b3d1c689a2aRoshan Pius struct wpa_ssid *ssid = wpa_supplicant_add_network(wpa_s); 516d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius if (!ssid) { 5174b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, network}; 518d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius } 51957ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius HidlManager *hidl_manager = HidlManager::getInstance(); 52057ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius if (!hidl_manager || 521bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius hidl_manager->getStaNetworkHidlObjectByIfnameAndNetworkId( 5227c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius wpa_s->ifname, ssid->id, &network)) { 5234b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, network}; 524d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius } 5254b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {{SupplicantStatusCode::SUCCESS, ""}, network}; 526d6e375115b04e4ce30144a6a21ef4b1f8d3a0071Roshan Pius} 527d6e375115b04e4ce30144a6a21ef4b1f8d3a0071Roshan Pius 5284b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::removeNetworkInternal(SupplicantNetworkId id) 529d6e375115b04e4ce30144a6a21ef4b1f8d3a0071Roshan Pius{ 530d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 5317c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius int result = wpa_supplicant_remove_network(wpa_s, id); 532f745df8121ceec43d19edba801ab7b3d1c689a2aRoshan Pius if (result == -1) { 5334b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::FAILURE_NETWORK_UNKNOWN, ""}; 534d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius } 5357c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius if (result != 0) { 5364b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::FAILURE_UNKNOWN, ""}; 537d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius } 5384b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 539d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius} 540d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 5414b527167fea5e519091442036c6c0fa0d03c7806Roshan Piusstd::pair<SupplicantStatus, sp<ISupplicantNetwork>> 5424b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusStaIface::getNetworkInternal(SupplicantNetworkId id) 543d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius{ 544bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius android::sp<ISupplicantStaNetwork> network; 545d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 5467c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius struct wpa_ssid *ssid = wpa_config_get_network(wpa_s->conf, id); 547d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius if (!ssid) { 5484b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {{SupplicantStatusCode::FAILURE_NETWORK_UNKNOWN, ""}, 5494b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius network}; 550d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius } 55157ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius HidlManager *hidl_manager = HidlManager::getInstance(); 55257ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius if (!hidl_manager || 553bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius hidl_manager->getStaNetworkHidlObjectByIfnameAndNetworkId( 5547c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius wpa_s->ifname, ssid->id, &network)) { 5554b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, network}; 5567c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius } 5574b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {{SupplicantStatusCode::SUCCESS, ""}, network}; 5587c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} 5597c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius 5604b527167fea5e519091442036c6c0fa0d03c7806Roshan Piusstd::pair<SupplicantStatus, std::vector<SupplicantNetworkId>> 5614b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusStaIface::listNetworksInternal() 5627c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius{ 5634b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius std::vector<SupplicantNetworkId> network_ids; 5647c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 5657c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius for (struct wpa_ssid *wpa_ssid = wpa_s->conf->ssid; wpa_ssid; 5667c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius wpa_ssid = wpa_ssid->next) { 5677c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius network_ids.emplace_back(wpa_ssid->id); 5687c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius } 5694b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {{SupplicantStatusCode::SUCCESS, ""}, std::move(network_ids)}; 570d6e375115b04e4ce30144a6a21ef4b1f8d3a0071Roshan Pius} 571d6e375115b04e4ce30144a6a21ef4b1f8d3a0071Roshan Pius 5724b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::registerCallbackInternal( 5734b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius const sp<ISupplicantStaIfaceCallback> &callback) 5740470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius{ 57557ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius HidlManager *hidl_manager = HidlManager::getInstance(); 57657ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius if (!hidl_manager || 577bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius hidl_manager->addStaIfaceCallbackHidlObject(ifname_, callback)) { 5784b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::FAILURE_UNKNOWN, ""}; 5790470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius } 5804b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 5810470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius} 5820470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius 5834b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::reassociateInternal() 584f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius{ 585f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 586f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) { 5874b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::FAILURE_IFACE_DISABLED, ""}; 588f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius } 5894b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius wpas_request_connection(wpa_s); 5904b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 591f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius} 592f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius 5934b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::reconnectInternal() 594f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius{ 595f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 596f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) { 5974b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::FAILURE_IFACE_DISABLED, ""}; 598f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius } 599f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius if (!wpa_s->disconnected) { 6004b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::FAILURE_IFACE_NOT_DISCONNECTED, 6014b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius ""}; 602f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius } 603f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius wpas_request_connection(wpa_s); 6044b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 605f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius} 606f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius 6074b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::disconnectInternal() 608f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius{ 609f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 610f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) { 6114b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::FAILURE_IFACE_DISABLED, ""}; 612f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius } 613f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius wpas_request_disconnection(wpa_s); 6144b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 615f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius} 616f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius 6174b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::setPowerSaveInternal(bool enable) 618390ba2881ef621db480848b7e50b93d61542206aRoshan Pius{ 619390ba2881ef621db480848b7e50b93d61542206aRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 6204b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) { 6214b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::FAILURE_IFACE_DISABLED, ""}; 6227c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius } 623390ba2881ef621db480848b7e50b93d61542206aRoshan Pius if (wpa_drv_set_p2p_powersave(wpa_s, enable, -1, -1)) { 6244b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::FAILURE_UNKNOWN, ""}; 625390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } 6264b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 627390ba2881ef621db480848b7e50b93d61542206aRoshan Pius} 628390ba2881ef621db480848b7e50b93d61542206aRoshan Pius 6294b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::initiateTdlsDiscoverInternal( 6304b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius const std::array<uint8_t, 6> &mac_address) 631390ba2881ef621db480848b7e50b93d61542206aRoshan Pius{ 632390ba2881ef621db480848b7e50b93d61542206aRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 633390ba2881ef621db480848b7e50b93d61542206aRoshan Pius int ret; 634390ba2881ef621db480848b7e50b93d61542206aRoshan Pius const u8 *peer = mac_address.data(); 635390ba2881ef621db480848b7e50b93d61542206aRoshan Pius if (wpa_tdls_is_external_setup(wpa_s->wpa)) { 636390ba2881ef621db480848b7e50b93d61542206aRoshan Pius ret = wpa_tdls_send_discovery_request(wpa_s->wpa, peer); 637390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } else { 638390ba2881ef621db480848b7e50b93d61542206aRoshan Pius ret = wpa_drv_tdls_oper(wpa_s, TDLS_DISCOVERY_REQ, peer); 639390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } 640390ba2881ef621db480848b7e50b93d61542206aRoshan Pius if (ret) { 641e9f688243cb408e68f3e60f827cf66deacf8e985Ningyuan Wang wpa_printf(MSG_INFO, "StaIface: TDLS discover failed: %d", ret); 642390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } 6434b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 644390ba2881ef621db480848b7e50b93d61542206aRoshan Pius} 645390ba2881ef621db480848b7e50b93d61542206aRoshan Pius 6464b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::initiateTdlsSetupInternal( 6474b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius const std::array<uint8_t, 6> &mac_address) 648390ba2881ef621db480848b7e50b93d61542206aRoshan Pius{ 649390ba2881ef621db480848b7e50b93d61542206aRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 650390ba2881ef621db480848b7e50b93d61542206aRoshan Pius int ret; 651390ba2881ef621db480848b7e50b93d61542206aRoshan Pius const u8 *peer = mac_address.data(); 652390ba2881ef621db480848b7e50b93d61542206aRoshan Pius if (wpa_tdls_is_external_setup(wpa_s->wpa) && 653390ba2881ef621db480848b7e50b93d61542206aRoshan Pius !(wpa_s->conf->tdls_external_control)) { 654390ba2881ef621db480848b7e50b93d61542206aRoshan Pius wpa_tdls_remove(wpa_s->wpa, peer); 655390ba2881ef621db480848b7e50b93d61542206aRoshan Pius ret = wpa_tdls_start(wpa_s->wpa, peer); 656390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } else { 657390ba2881ef621db480848b7e50b93d61542206aRoshan Pius ret = wpa_drv_tdls_oper(wpa_s, TDLS_SETUP, peer); 658390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } 659390ba2881ef621db480848b7e50b93d61542206aRoshan Pius if (ret) { 660e9f688243cb408e68f3e60f827cf66deacf8e985Ningyuan Wang wpa_printf(MSG_INFO, "StaIface: TDLS setup failed: %d", ret); 661390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } 6624b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 663390ba2881ef621db480848b7e50b93d61542206aRoshan Pius} 664390ba2881ef621db480848b7e50b93d61542206aRoshan Pius 6654b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::initiateTdlsTeardownInternal( 6664b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius const std::array<uint8_t, 6> &mac_address) 667390ba2881ef621db480848b7e50b93d61542206aRoshan Pius{ 668390ba2881ef621db480848b7e50b93d61542206aRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 669390ba2881ef621db480848b7e50b93d61542206aRoshan Pius int ret; 670390ba2881ef621db480848b7e50b93d61542206aRoshan Pius const u8 *peer = mac_address.data(); 671390ba2881ef621db480848b7e50b93d61542206aRoshan Pius if (wpa_tdls_is_external_setup(wpa_s->wpa) && 672390ba2881ef621db480848b7e50b93d61542206aRoshan Pius !(wpa_s->conf->tdls_external_control)) { 673390ba2881ef621db480848b7e50b93d61542206aRoshan Pius ret = wpa_tdls_teardown_link( 674390ba2881ef621db480848b7e50b93d61542206aRoshan Pius wpa_s->wpa, peer, WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED); 675390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } else { 676390ba2881ef621db480848b7e50b93d61542206aRoshan Pius ret = wpa_drv_tdls_oper(wpa_s, TDLS_TEARDOWN, peer); 677390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } 678390ba2881ef621db480848b7e50b93d61542206aRoshan Pius if (ret) { 679e9f688243cb408e68f3e60f827cf66deacf8e985Ningyuan Wang wpa_printf(MSG_INFO, "StaIface: TDLS teardown failed: %d", ret); 680390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } 6814b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 682390ba2881ef621db480848b7e50b93d61542206aRoshan Pius} 683390ba2881ef621db480848b7e50b93d61542206aRoshan Pius 684802517d19b6192b17c81e7ccbd036f8d2115433aRoshan PiusSupplicantStatus StaIface::initiateAnqpQueryInternal( 685802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius const std::array<uint8_t, 6> &mac_address, 686802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius const std::vector<ISupplicantStaIface::AnqpInfoId> &info_elements, 687802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius const std::vector<ISupplicantStaIface::Hs20AnqpSubtypes> &sub_types) 688802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius{ 68908f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 69008f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius if (info_elements.size() > kMaxAnqpElems) { 69108f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius return {SupplicantStatusCode::FAILURE_ARGS_INVALID, ""}; 69208f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius } 693cc347610a2328522e91ad1fa1ae326945446ea1dRoshan Pius uint16_t info_elems_buf[kMaxAnqpElems]; 69408f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius uint32_t num_info_elems = 0; 69508f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius for (const auto &info_element : info_elements) { 69608f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius info_elems_buf[num_info_elems++] = 69708f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius static_cast<std::underlying_type< 69808f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius ISupplicantStaIface::AnqpInfoId>::type>(info_element); 69908f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius } 70008f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius uint32_t sub_types_bitmask = 0; 70108f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius for (const auto &type : sub_types) { 70208f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius sub_types_bitmask |= BIT( 70308f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius static_cast<std::underlying_type< 70408f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius ISupplicantStaIface::Hs20AnqpSubtypes>::type>(type)); 70508f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius } 70608f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius if (anqp_send_req( 70708f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius wpa_s, mac_address.data(), info_elems_buf, num_info_elems, 70808f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius sub_types_bitmask, false)) { 70908f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius return {SupplicantStatusCode::FAILURE_UNKNOWN, ""}; 71008f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius } 711802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 712802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius} 713802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius 714802517d19b6192b17c81e7ccbd036f8d2115433aRoshan PiusSupplicantStatus StaIface::initiateHs20IconQueryInternal( 715802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius const std::array<uint8_t, 6> &mac_address, const std::string &file_name) 716802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius{ 71708f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 71808f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius wpa_s->fetch_osu_icon_in_progress = 0; 71908f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius if (hs20_anqp_send_req( 72008f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius wpa_s, mac_address.data(), BIT(HS20_STYPE_ICON_REQUEST), 72108f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius reinterpret_cast<const uint8_t *>(file_name.c_str()), 72208f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius file_name.size(), true)) { 72308f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius return {SupplicantStatusCode::FAILURE_UNKNOWN, ""}; 72408f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius } 725802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 726802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius} 727802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius 7283599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusstd::pair<SupplicantStatus, std::array<uint8_t, 6>> 7293599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusStaIface::getMacAddressInternal() 7303599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 7313599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 7323599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius std::vector<char> cmd( 7333599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius kGetMacAddress, kGetMacAddress + sizeof(kGetMacAddress)); 7343599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius char driver_cmd_reply_buf[4096] = {}; 7353599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius int ret = wpa_drv_driver_cmd( 7363599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius wpa_s, cmd.data(), driver_cmd_reply_buf, 7373599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius sizeof(driver_cmd_reply_buf)); 7383599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius // Reply is of the format: "Macaddr = XX:XX:XX:XX:XX:XX" 7393599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius std::string reply_str = driver_cmd_reply_buf; 7403431fd2b55ff8d6cc49e044a1032e55828168b9eRoshan Pius if (ret < 0 || reply_str.empty() || 7413599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius reply_str.find("=") == std::string::npos) { 7423599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, {}}; 7433599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius } 7443599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius // Remove all whitespace first and then split using the delimiter "=". 7453599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius reply_str.erase( 7463599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius remove_if(reply_str.begin(), reply_str.end(), isspace), 7473599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius reply_str.end()); 7483599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius std::string mac_addr_str = 7493599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius reply_str.substr(reply_str.find("=") + 1, reply_str.size()); 7503599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius std::array<uint8_t, 6> mac_addr; 7513599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius if (hwaddr_aton(mac_addr_str.c_str(), mac_addr.data())) { 7523599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, {}}; 7533599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius } 7543599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return {{SupplicantStatusCode::SUCCESS, ""}, mac_addr}; 7553599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 7563599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 7573599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::startRxFilterInternal() 7583599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 7593599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return doZeroArgDriverCommand(retrieveIfacePtr(), kStartRxFilter); 7603599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 7613599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 7623599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::stopRxFilterInternal() 7633599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 7643599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return doZeroArgDriverCommand(retrieveIfacePtr(), kStopRxFilter); 7653599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 7663599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 7673599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::addRxFilterInternal( 7683599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius ISupplicantStaIface::RxFilterType type) 7693599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 7703599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return doOneArgDriverCommand( 7713599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius retrieveIfacePtr(), kAddRxFilter, 7723599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius convertHidlRxFilterTypeToInternal(type)); 7733599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 7743599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 7753599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::removeRxFilterInternal( 7763599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius ISupplicantStaIface::RxFilterType type) 7773599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 7783599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return doOneArgDriverCommand( 7793599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius retrieveIfacePtr(), kRemoveRxFilter, 7803599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius convertHidlRxFilterTypeToInternal(type)); 7813599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 7823599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 7833599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::setBtCoexistenceModeInternal( 7843599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius ISupplicantStaIface::BtCoexistenceMode mode) 7853599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 7863599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return doOneArgDriverCommand( 7873599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius retrieveIfacePtr(), kSetBtCoexistenceMode, 7883599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius convertHidlBtCoexModeToInternal(mode)); 7893599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 7903599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 7913599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::setBtCoexistenceScanModeEnabledInternal(bool enable) 7923599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 7933599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius const char *cmd; 7943599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius if (enable) { 7953599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius cmd = kSetBtCoexistenceScanStart; 7963599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius } else { 7973599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius cmd = kSetBtCoexistenceScanStop; 7983599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius } 7993599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return doZeroArgDriverCommand(retrieveIfacePtr(), cmd); 8003599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 8013599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 8023599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::setSuspendModeEnabledInternal(bool enable) 8033599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 8043599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius const char *cmd; 8053599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius if (enable) { 8063599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius cmd = kSetSupendModeEnabled; 8073599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius } else { 8083599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius cmd = kSetSupendModeDisabled; 8093599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius } 8103599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return doZeroArgDriverCommand(retrieveIfacePtr(), cmd); 8113599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 8123599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 8133599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::setCountryCodeInternal( 8143599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius const std::array<int8_t, 2> &code) 8153599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 8163599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 8173599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius SupplicantStatus status = doOneArgDriverCommand( 8183599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius wpa_s, kSetCountryCode, 8193599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius std::string(std::begin(code), std::end(code))); 8203599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius if (status.code != SupplicantStatusCode::SUCCESS) { 8213599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return status; 8223599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius } 8233599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius struct p2p_data *p2p = wpa_s->global->p2p; 8243599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius if (p2p) { 8253599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius char country[3]; 8263599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius country[0] = code[0]; 8273599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius country[1] = code[1]; 8283599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius country[2] = 0x04; 8293599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius p2p_set_country(p2p, country); 8303599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius } 8313599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 8323599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 8333599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 834149327590e009d96301e69772e717e227215d5acRoshan PiusSupplicantStatus StaIface::startWpsRegistrarInternal( 835149327590e009d96301e69772e717e227215d5acRoshan Pius const std::array<uint8_t, 6> &bssid, const std::string &pin) 836149327590e009d96301e69772e717e227215d5acRoshan Pius{ 837149327590e009d96301e69772e717e227215d5acRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 838149327590e009d96301e69772e717e227215d5acRoshan Pius if (wpas_wps_start_reg(wpa_s, bssid.data(), pin.c_str(), nullptr)) { 839149327590e009d96301e69772e717e227215d5acRoshan Pius return {SupplicantStatusCode::FAILURE_UNKNOWN, ""}; 840149327590e009d96301e69772e717e227215d5acRoshan Pius } 841149327590e009d96301e69772e717e227215d5acRoshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 842149327590e009d96301e69772e717e227215d5acRoshan Pius} 843149327590e009d96301e69772e717e227215d5acRoshan Pius 844149327590e009d96301e69772e717e227215d5acRoshan PiusSupplicantStatus StaIface::startWpsPbcInternal( 845149327590e009d96301e69772e717e227215d5acRoshan Pius const std::array<uint8_t, 6> &bssid) 846149327590e009d96301e69772e717e227215d5acRoshan Pius{ 847149327590e009d96301e69772e717e227215d5acRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 848149327590e009d96301e69772e717e227215d5acRoshan Pius const uint8_t *bssid_addr = 849149327590e009d96301e69772e717e227215d5acRoshan Pius is_zero_ether_addr(bssid.data()) ? nullptr : bssid.data(); 850149327590e009d96301e69772e717e227215d5acRoshan Pius if (wpas_wps_start_pbc(wpa_s, bssid_addr, 0)) { 851149327590e009d96301e69772e717e227215d5acRoshan Pius return {SupplicantStatusCode::FAILURE_UNKNOWN, ""}; 852149327590e009d96301e69772e717e227215d5acRoshan Pius } 853149327590e009d96301e69772e717e227215d5acRoshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 854149327590e009d96301e69772e717e227215d5acRoshan Pius} 855149327590e009d96301e69772e717e227215d5acRoshan Pius 856149327590e009d96301e69772e717e227215d5acRoshan PiusSupplicantStatus StaIface::startWpsPinKeypadInternal(const std::string &pin) 857149327590e009d96301e69772e717e227215d5acRoshan Pius{ 858149327590e009d96301e69772e717e227215d5acRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 859149327590e009d96301e69772e717e227215d5acRoshan Pius if (wpas_wps_start_pin( 860149327590e009d96301e69772e717e227215d5acRoshan Pius wpa_s, nullptr, pin.c_str(), 0, DEV_PW_DEFAULT)) { 861149327590e009d96301e69772e717e227215d5acRoshan Pius return {SupplicantStatusCode::FAILURE_UNKNOWN, ""}; 862149327590e009d96301e69772e717e227215d5acRoshan Pius } 863149327590e009d96301e69772e717e227215d5acRoshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 864149327590e009d96301e69772e717e227215d5acRoshan Pius} 865149327590e009d96301e69772e717e227215d5acRoshan Pius 866149327590e009d96301e69772e717e227215d5acRoshan Piusstd::pair<SupplicantStatus, std::string> StaIface::startWpsPinDisplayInternal( 867149327590e009d96301e69772e717e227215d5acRoshan Pius const std::array<uint8_t, 6> &bssid) 868149327590e009d96301e69772e717e227215d5acRoshan Pius{ 869149327590e009d96301e69772e717e227215d5acRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 870149327590e009d96301e69772e717e227215d5acRoshan Pius const uint8_t *bssid_addr = 871149327590e009d96301e69772e717e227215d5acRoshan Pius is_zero_ether_addr(bssid.data()) ? nullptr : bssid.data(); 872149327590e009d96301e69772e717e227215d5acRoshan Pius int pin = 873149327590e009d96301e69772e717e227215d5acRoshan Pius wpas_wps_start_pin(wpa_s, bssid_addr, nullptr, 0, DEV_PW_DEFAULT); 874149327590e009d96301e69772e717e227215d5acRoshan Pius if (pin < 0) { 875149327590e009d96301e69772e717e227215d5acRoshan Pius return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, ""}; 876149327590e009d96301e69772e717e227215d5acRoshan Pius } 877235f7da827f7236c90f837b5604a026d3f61b8a1Roshan Pius return {{SupplicantStatusCode::SUCCESS, ""}, 878235f7da827f7236c90f837b5604a026d3f61b8a1Roshan Pius misc_utils::convertWpsPinToString(pin)}; 879149327590e009d96301e69772e717e227215d5acRoshan Pius} 880149327590e009d96301e69772e717e227215d5acRoshan Pius 881149327590e009d96301e69772e717e227215d5acRoshan PiusSupplicantStatus StaIface::cancelWpsInternal() 882149327590e009d96301e69772e717e227215d5acRoshan Pius{ 883149327590e009d96301e69772e717e227215d5acRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 884149327590e009d96301e69772e717e227215d5acRoshan Pius if (wpas_wps_cancel(wpa_s)) { 885149327590e009d96301e69772e717e227215d5acRoshan Pius return {SupplicantStatusCode::FAILURE_UNKNOWN, ""}; 886149327590e009d96301e69772e717e227215d5acRoshan Pius } 887149327590e009d96301e69772e717e227215d5acRoshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 888149327590e009d96301e69772e717e227215d5acRoshan Pius} 889149327590e009d96301e69772e717e227215d5acRoshan Pius 8906a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusSupplicantStatus StaIface::setWpsDeviceNameInternal(const std::string &name) 8916a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{ 8926a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return iface_config_utils::setWpsDeviceName(retrieveIfacePtr(), name); 8936a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} 8946a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 89594426e651275a0ef2261783b7eb13aa64012bbc8Roshan PiusSupplicantStatus StaIface::setWpsDeviceTypeInternal( 89694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius const std::array<uint8_t, 8> &type) 89794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{ 89894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius return iface_config_utils::setWpsDeviceType(retrieveIfacePtr(), type); 89994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius} 90094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 9016a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusSupplicantStatus StaIface::setWpsManufacturerInternal( 9026a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius const std::string &manufacturer) 9036a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{ 9046a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return iface_config_utils::setWpsManufacturer( 9056a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius retrieveIfacePtr(), manufacturer); 9066a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} 9076a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 9086a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusSupplicantStatus StaIface::setWpsModelNameInternal( 9096a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius const std::string &model_name) 9106a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{ 9116a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return iface_config_utils::setWpsModelName( 9126a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius retrieveIfacePtr(), model_name); 9136a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} 9146a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 9156a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusSupplicantStatus StaIface::setWpsModelNumberInternal( 9166a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius const std::string &model_number) 9176a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{ 9186a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return iface_config_utils::setWpsModelNumber( 9196a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius retrieveIfacePtr(), model_number); 9206a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} 9216a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 9226a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusSupplicantStatus StaIface::setWpsSerialNumberInternal( 9236a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius const std::string &serial_number) 9246a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{ 9256a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return iface_config_utils::setWpsSerialNumber( 9266a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius retrieveIfacePtr(), serial_number); 9276a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} 9286a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 9296a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusSupplicantStatus StaIface::setWpsConfigMethodsInternal(uint16_t config_methods) 9306a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{ 9316a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return iface_config_utils::setWpsConfigMethods( 9326a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius retrieveIfacePtr(), config_methods); 9336a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} 9346a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 9356a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusSupplicantStatus StaIface::setExternalSimInternal(bool useExternalSim) 9366a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{ 9376a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return iface_config_utils::setExternalSim( 9386a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius retrieveIfacePtr(), useExternalSim); 9396a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} 9406a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 94194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Piusstd::pair<SupplicantStatus, uint32_t> StaIface::addExtRadioWorkInternal( 94294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius const std::string &name, uint32_t freq_in_mhz, uint32_t timeout_in_sec) 94394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{ 94494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 94594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius auto *ework = static_cast<struct wpa_external_work *>( 94694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius os_zalloc(sizeof(struct wpa_external_work))); 94794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius if (!ework) { 94894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, 94994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius UINT32_MAX}; 95094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius } 95194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 95294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius std::string radio_work_name = kExtRadioWorkNamePrefix + name; 95394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius os_strlcpy(ework->type, radio_work_name.c_str(), sizeof(ework->type)); 95494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius ework->timeout = timeout_in_sec; 95594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius wpa_s->ext_work_id++; 95694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius if (wpa_s->ext_work_id == 0) { 95794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius wpa_s->ext_work_id++; 95894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius } 95994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius ework->id = wpa_s->ext_work_id; 96094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 96194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius if (radio_add_work( 96294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius wpa_s, freq_in_mhz, ework->type, 0, extRadioWorkStartCb, 96394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius ework)) { 96494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius os_free(ework); 96594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, 96694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius UINT32_MAX}; 96794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius } 96894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius return {SupplicantStatus{SupplicantStatusCode::SUCCESS, ""}, ework->id}; 96994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius} 97094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 97194426e651275a0ef2261783b7eb13aa64012bbc8Roshan PiusSupplicantStatus StaIface::removeExtRadioWorkInternal(uint32_t id) 97294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{ 97394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 97494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius struct wpa_radio_work *work; 97594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius dl_list_for_each(work, &wpa_s->radio->work, struct wpa_radio_work, list) 97694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius { 97794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius if (os_strncmp( 97894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius work->type, kExtRadioWorkNamePrefix, 97994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius sizeof(kExtRadioWorkNamePrefix)) != 0) 98094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius continue; 98194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 98294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius auto *ework = 98394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius static_cast<struct wpa_external_work *>(work->ctx); 98494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius if (ework->id != id) 98594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius continue; 98694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 98794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius wpa_dbg( 98894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius wpa_s, MSG_DEBUG, "Completed external radio work %u (%s)", 98994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius ework->id, ework->type); 99094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius eloop_cancel_timeout(extRadioWorkTimeoutCb, work, NULL); 99194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius endExtRadioWork(work); 99294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 99394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 99494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius } 99594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius return {SupplicantStatusCode::FAILURE_UNKNOWN, ""}; 99694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius} 99794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 9985712631c22c328fa5db65cec7575afaefbb2a720Roshan PiusSupplicantStatus StaIface::enableAutoReconnectInternal(bool enable) 9995712631c22c328fa5db65cec7575afaefbb2a720Roshan Pius{ 10005712631c22c328fa5db65cec7575afaefbb2a720Roshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 10015712631c22c328fa5db65cec7575afaefbb2a720Roshan Pius wpa_s->auto_reconnect_disabled = enable ? 0 : 1; 10025712631c22c328fa5db65cec7575afaefbb2a720Roshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 10035712631c22c328fa5db65cec7575afaefbb2a720Roshan Pius} 10045712631c22c328fa5db65cec7575afaefbb2a720Roshan Pius 100554e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius/** 10067c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius * Retrieve the underlying |wpa_supplicant| struct 10077c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius * pointer for this iface. 10087c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius * If the underlying iface is removed, then all RPC method calls on this object 10097c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius * will return failure. 101054e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius */ 1011bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Piuswpa_supplicant *StaIface::retrieveIfacePtr() 101254e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius{ 101308f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius return wpa_supplicant_get_iface(wpa_global_, ifname_.c_str()); 101454e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius} 10157c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace implementation 10167c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace V1_0 10177c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace wifi 10187c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace supplicant 10197c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace hardware 10207c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace android 1021