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