sta_iface.cpp revision 1295dfb961a5dc5186ebc58753cf82eaba16e51f
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 4914b527167fea5e519091442036c6c0fa0d03c7806Roshan Piusstd::pair<SupplicantStatus, std::string> StaIface::getNameInternal() 4924b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{ 4934b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {{SupplicantStatusCode::SUCCESS, ""}, ifname_}; 4944b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius} 4954b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius 4964b527167fea5e519091442036c6c0fa0d03c7806Roshan Piusstd::pair<SupplicantStatus, IfaceType> StaIface::getTypeInternal() 4974b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{ 4984b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {{SupplicantStatusCode::SUCCESS, ""}, IfaceType::STA}; 4994b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius} 5004b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius 5014b527167fea5e519091442036c6c0fa0d03c7806Roshan Piusstd::pair<SupplicantStatus, sp<ISupplicantNetwork>> 5024b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusStaIface::addNetworkInternal() 5034b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius{ 504bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius android::sp<ISupplicantStaNetwork> network; 505d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 506f745df8121ceec43d19edba801ab7b3d1c689a2aRoshan Pius struct wpa_ssid *ssid = wpa_supplicant_add_network(wpa_s); 507d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius if (!ssid) { 5084b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, network}; 509d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius } 51057ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius HidlManager *hidl_manager = HidlManager::getInstance(); 51157ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius if (!hidl_manager || 512bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius hidl_manager->getStaNetworkHidlObjectByIfnameAndNetworkId( 5137c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius wpa_s->ifname, ssid->id, &network)) { 5144b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, network}; 515d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius } 5164b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {{SupplicantStatusCode::SUCCESS, ""}, network}; 517d6e375115b04e4ce30144a6a21ef4b1f8d3a0071Roshan Pius} 518d6e375115b04e4ce30144a6a21ef4b1f8d3a0071Roshan Pius 5194b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::removeNetworkInternal(SupplicantNetworkId id) 520d6e375115b04e4ce30144a6a21ef4b1f8d3a0071Roshan Pius{ 521d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 5227c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius int result = wpa_supplicant_remove_network(wpa_s, id); 523f745df8121ceec43d19edba801ab7b3d1c689a2aRoshan Pius if (result == -1) { 5244b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::FAILURE_NETWORK_UNKNOWN, ""}; 525d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius } 5267c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius if (result != 0) { 5274b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::FAILURE_UNKNOWN, ""}; 528d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius } 5294b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 530d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius} 531d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 5324b527167fea5e519091442036c6c0fa0d03c7806Roshan Piusstd::pair<SupplicantStatus, sp<ISupplicantNetwork>> 5334b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusStaIface::getNetworkInternal(SupplicantNetworkId id) 534d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius{ 535bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius android::sp<ISupplicantStaNetwork> network; 536d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 5377c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius struct wpa_ssid *ssid = wpa_config_get_network(wpa_s->conf, id); 538d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius if (!ssid) { 5394b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {{SupplicantStatusCode::FAILURE_NETWORK_UNKNOWN, ""}, 5404b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius network}; 541d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius } 54257ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius HidlManager *hidl_manager = HidlManager::getInstance(); 54357ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius if (!hidl_manager || 544bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius hidl_manager->getStaNetworkHidlObjectByIfnameAndNetworkId( 5457c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius wpa_s->ifname, ssid->id, &network)) { 5464b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, network}; 5477c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius } 5484b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {{SupplicantStatusCode::SUCCESS, ""}, network}; 5497c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} 5507c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius 5514b527167fea5e519091442036c6c0fa0d03c7806Roshan Piusstd::pair<SupplicantStatus, std::vector<SupplicantNetworkId>> 5524b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusStaIface::listNetworksInternal() 5537c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius{ 5544b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius std::vector<SupplicantNetworkId> network_ids; 5557c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 5567c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius for (struct wpa_ssid *wpa_ssid = wpa_s->conf->ssid; wpa_ssid; 5577c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius wpa_ssid = wpa_ssid->next) { 5587c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius network_ids.emplace_back(wpa_ssid->id); 5597c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius } 5604b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {{SupplicantStatusCode::SUCCESS, ""}, std::move(network_ids)}; 561d6e375115b04e4ce30144a6a21ef4b1f8d3a0071Roshan Pius} 562d6e375115b04e4ce30144a6a21ef4b1f8d3a0071Roshan Pius 5634b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::registerCallbackInternal( 5644b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius const sp<ISupplicantStaIfaceCallback> &callback) 5650470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius{ 56657ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius HidlManager *hidl_manager = HidlManager::getInstance(); 56757ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius if (!hidl_manager || 568bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius hidl_manager->addStaIfaceCallbackHidlObject(ifname_, callback)) { 5694b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::FAILURE_UNKNOWN, ""}; 5700470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius } 5714b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 5720470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius} 5730470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius 5744b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::reassociateInternal() 575f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius{ 576f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 577f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) { 5784b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::FAILURE_IFACE_DISABLED, ""}; 579f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius } 5804b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius wpas_request_connection(wpa_s); 5814b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 582f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius} 583f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius 5844b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::reconnectInternal() 585f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius{ 586f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 587f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) { 5884b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::FAILURE_IFACE_DISABLED, ""}; 589f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius } 590f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius if (!wpa_s->disconnected) { 5914b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::FAILURE_IFACE_NOT_DISCONNECTED, 5924b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius ""}; 593f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius } 594f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius wpas_request_connection(wpa_s); 5954b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 596f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius} 597f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius 5984b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::disconnectInternal() 599f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius{ 600f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 601f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) { 6024b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::FAILURE_IFACE_DISABLED, ""}; 603f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius } 604f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius wpas_request_disconnection(wpa_s); 6054b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 606f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius} 607f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius 6084b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::setPowerSaveInternal(bool enable) 609390ba2881ef621db480848b7e50b93d61542206aRoshan Pius{ 610390ba2881ef621db480848b7e50b93d61542206aRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 6114b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) { 6124b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::FAILURE_IFACE_DISABLED, ""}; 6137c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius } 614390ba2881ef621db480848b7e50b93d61542206aRoshan Pius if (wpa_drv_set_p2p_powersave(wpa_s, enable, -1, -1)) { 6154b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::FAILURE_UNKNOWN, ""}; 616390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } 6174b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 618390ba2881ef621db480848b7e50b93d61542206aRoshan Pius} 619390ba2881ef621db480848b7e50b93d61542206aRoshan Pius 6204b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::initiateTdlsDiscoverInternal( 6214b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius const std::array<uint8_t, 6> &mac_address) 622390ba2881ef621db480848b7e50b93d61542206aRoshan Pius{ 623390ba2881ef621db480848b7e50b93d61542206aRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 624390ba2881ef621db480848b7e50b93d61542206aRoshan Pius int ret; 625390ba2881ef621db480848b7e50b93d61542206aRoshan Pius const u8 *peer = mac_address.data(); 626390ba2881ef621db480848b7e50b93d61542206aRoshan Pius if (wpa_tdls_is_external_setup(wpa_s->wpa)) { 627390ba2881ef621db480848b7e50b93d61542206aRoshan Pius ret = wpa_tdls_send_discovery_request(wpa_s->wpa, peer); 628390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } else { 629390ba2881ef621db480848b7e50b93d61542206aRoshan Pius ret = wpa_drv_tdls_oper(wpa_s, TDLS_DISCOVERY_REQ, peer); 630390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } 631390ba2881ef621db480848b7e50b93d61542206aRoshan Pius if (ret) { 6324b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::FAILURE_UNKNOWN, ""}; 633390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } 6344b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 635390ba2881ef621db480848b7e50b93d61542206aRoshan Pius} 636390ba2881ef621db480848b7e50b93d61542206aRoshan Pius 6374b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::initiateTdlsSetupInternal( 6384b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius const std::array<uint8_t, 6> &mac_address) 639390ba2881ef621db480848b7e50b93d61542206aRoshan Pius{ 640390ba2881ef621db480848b7e50b93d61542206aRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 641390ba2881ef621db480848b7e50b93d61542206aRoshan Pius int ret; 642390ba2881ef621db480848b7e50b93d61542206aRoshan Pius const u8 *peer = mac_address.data(); 643390ba2881ef621db480848b7e50b93d61542206aRoshan Pius if (wpa_tdls_is_external_setup(wpa_s->wpa) && 644390ba2881ef621db480848b7e50b93d61542206aRoshan Pius !(wpa_s->conf->tdls_external_control)) { 645390ba2881ef621db480848b7e50b93d61542206aRoshan Pius wpa_tdls_remove(wpa_s->wpa, peer); 646390ba2881ef621db480848b7e50b93d61542206aRoshan Pius ret = wpa_tdls_start(wpa_s->wpa, peer); 647390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } else { 648390ba2881ef621db480848b7e50b93d61542206aRoshan Pius ret = wpa_drv_tdls_oper(wpa_s, TDLS_SETUP, peer); 649390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } 650390ba2881ef621db480848b7e50b93d61542206aRoshan Pius if (ret) { 6514b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::FAILURE_UNKNOWN, ""}; 652390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } 6534b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 654390ba2881ef621db480848b7e50b93d61542206aRoshan Pius} 655390ba2881ef621db480848b7e50b93d61542206aRoshan Pius 6564b527167fea5e519091442036c6c0fa0d03c7806Roshan PiusSupplicantStatus StaIface::initiateTdlsTeardownInternal( 6574b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius const std::array<uint8_t, 6> &mac_address) 658390ba2881ef621db480848b7e50b93d61542206aRoshan Pius{ 659390ba2881ef621db480848b7e50b93d61542206aRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 660390ba2881ef621db480848b7e50b93d61542206aRoshan Pius int ret; 661390ba2881ef621db480848b7e50b93d61542206aRoshan Pius const u8 *peer = mac_address.data(); 662390ba2881ef621db480848b7e50b93d61542206aRoshan Pius if (wpa_tdls_is_external_setup(wpa_s->wpa) && 663390ba2881ef621db480848b7e50b93d61542206aRoshan Pius !(wpa_s->conf->tdls_external_control)) { 664390ba2881ef621db480848b7e50b93d61542206aRoshan Pius ret = wpa_tdls_teardown_link( 665390ba2881ef621db480848b7e50b93d61542206aRoshan Pius wpa_s->wpa, peer, WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED); 666390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } else { 667390ba2881ef621db480848b7e50b93d61542206aRoshan Pius ret = wpa_drv_tdls_oper(wpa_s, TDLS_TEARDOWN, peer); 668390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } 669390ba2881ef621db480848b7e50b93d61542206aRoshan Pius if (ret) { 6704b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::FAILURE_UNKNOWN, ""}; 671390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } 6724b527167fea5e519091442036c6c0fa0d03c7806Roshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 673390ba2881ef621db480848b7e50b93d61542206aRoshan Pius} 674390ba2881ef621db480848b7e50b93d61542206aRoshan Pius 675802517d19b6192b17c81e7ccbd036f8d2115433aRoshan PiusSupplicantStatus StaIface::initiateAnqpQueryInternal( 676802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius const std::array<uint8_t, 6> &mac_address, 677802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius const std::vector<ISupplicantStaIface::AnqpInfoId> &info_elements, 678802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius const std::vector<ISupplicantStaIface::Hs20AnqpSubtypes> &sub_types) 679802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius{ 68008f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 68108f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius if (info_elements.size() > kMaxAnqpElems) { 68208f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius return {SupplicantStatusCode::FAILURE_ARGS_INVALID, ""}; 68308f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius } 684cc347610a2328522e91ad1fa1ae326945446ea1dRoshan Pius uint16_t info_elems_buf[kMaxAnqpElems]; 68508f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius uint32_t num_info_elems = 0; 68608f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius for (const auto &info_element : info_elements) { 68708f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius info_elems_buf[num_info_elems++] = 68808f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius static_cast<std::underlying_type< 68908f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius ISupplicantStaIface::AnqpInfoId>::type>(info_element); 69008f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius } 69108f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius uint32_t sub_types_bitmask = 0; 69208f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius for (const auto &type : sub_types) { 69308f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius sub_types_bitmask |= BIT( 69408f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius static_cast<std::underlying_type< 69508f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius ISupplicantStaIface::Hs20AnqpSubtypes>::type>(type)); 69608f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius } 69708f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius if (anqp_send_req( 69808f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius wpa_s, mac_address.data(), info_elems_buf, num_info_elems, 69908f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius sub_types_bitmask, false)) { 70008f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius return {SupplicantStatusCode::FAILURE_UNKNOWN, ""}; 70108f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius } 702802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 703802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius} 704802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius 705802517d19b6192b17c81e7ccbd036f8d2115433aRoshan PiusSupplicantStatus StaIface::initiateHs20IconQueryInternal( 706802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius const std::array<uint8_t, 6> &mac_address, const std::string &file_name) 707802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius{ 70808f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 70908f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius wpa_s->fetch_osu_icon_in_progress = 0; 71008f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius if (hs20_anqp_send_req( 71108f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius wpa_s, mac_address.data(), BIT(HS20_STYPE_ICON_REQUEST), 71208f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius reinterpret_cast<const uint8_t *>(file_name.c_str()), 71308f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius file_name.size(), true)) { 71408f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius return {SupplicantStatusCode::FAILURE_UNKNOWN, ""}; 71508f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius } 716802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 717802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius} 718802517d19b6192b17c81e7ccbd036f8d2115433aRoshan Pius 7193599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Piusstd::pair<SupplicantStatus, std::array<uint8_t, 6>> 7203599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusStaIface::getMacAddressInternal() 7213599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 7223599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 7233599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius std::vector<char> cmd( 7243599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius kGetMacAddress, kGetMacAddress + sizeof(kGetMacAddress)); 7253599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius char driver_cmd_reply_buf[4096] = {}; 7263599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius int ret = wpa_drv_driver_cmd( 7273599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius wpa_s, cmd.data(), driver_cmd_reply_buf, 7283599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius sizeof(driver_cmd_reply_buf)); 7293599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius // Reply is of the format: "Macaddr = XX:XX:XX:XX:XX:XX" 7303599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius std::string reply_str = driver_cmd_reply_buf; 7313599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius if (ret || reply_str.empty() || 7323599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius reply_str.find("=") == std::string::npos) { 7333599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, {}}; 7343599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius } 7353599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius // Remove all whitespace first and then split using the delimiter "=". 7363599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius reply_str.erase( 7373599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius remove_if(reply_str.begin(), reply_str.end(), isspace), 7383599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius reply_str.end()); 7393599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius std::string mac_addr_str = 7403599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius reply_str.substr(reply_str.find("=") + 1, reply_str.size()); 7413599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius std::array<uint8_t, 6> mac_addr; 7423599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius if (hwaddr_aton(mac_addr_str.c_str(), mac_addr.data())) { 7433599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, {}}; 7443599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius } 7453599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return {{SupplicantStatusCode::SUCCESS, ""}, mac_addr}; 7463599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 7473599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 7483599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::startRxFilterInternal() 7493599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 7503599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return doZeroArgDriverCommand(retrieveIfacePtr(), kStartRxFilter); 7513599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 7523599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 7533599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::stopRxFilterInternal() 7543599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 7553599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return doZeroArgDriverCommand(retrieveIfacePtr(), kStopRxFilter); 7563599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 7573599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 7583599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::addRxFilterInternal( 7593599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius ISupplicantStaIface::RxFilterType type) 7603599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 7613599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return doOneArgDriverCommand( 7623599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius retrieveIfacePtr(), kAddRxFilter, 7633599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius convertHidlRxFilterTypeToInternal(type)); 7643599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 7653599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 7663599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::removeRxFilterInternal( 7673599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius ISupplicantStaIface::RxFilterType type) 7683599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 7693599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return doOneArgDriverCommand( 7703599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius retrieveIfacePtr(), kRemoveRxFilter, 7713599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius convertHidlRxFilterTypeToInternal(type)); 7723599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 7733599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 7743599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::setBtCoexistenceModeInternal( 7753599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius ISupplicantStaIface::BtCoexistenceMode mode) 7763599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 7773599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return doOneArgDriverCommand( 7783599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius retrieveIfacePtr(), kSetBtCoexistenceMode, 7793599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius convertHidlBtCoexModeToInternal(mode)); 7803599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 7813599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 7823599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::setBtCoexistenceScanModeEnabledInternal(bool enable) 7833599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 7843599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius const char *cmd; 7853599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius if (enable) { 7863599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius cmd = kSetBtCoexistenceScanStart; 7873599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius } else { 7883599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius cmd = kSetBtCoexistenceScanStop; 7893599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius } 7903599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return doZeroArgDriverCommand(retrieveIfacePtr(), cmd); 7913599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 7923599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 7933599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::setSuspendModeEnabledInternal(bool enable) 7943599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 7953599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius const char *cmd; 7963599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius if (enable) { 7973599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius cmd = kSetSupendModeEnabled; 7983599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius } else { 7993599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius cmd = kSetSupendModeDisabled; 8003599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius } 8013599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return doZeroArgDriverCommand(retrieveIfacePtr(), cmd); 8023599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 8033599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 8043599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan PiusSupplicantStatus StaIface::setCountryCodeInternal( 8053599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius const std::array<int8_t, 2> &code) 8063599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius{ 8073599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 8083599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius SupplicantStatus status = doOneArgDriverCommand( 8093599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius wpa_s, kSetCountryCode, 8103599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius std::string(std::begin(code), std::end(code))); 8113599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius if (status.code != SupplicantStatusCode::SUCCESS) { 8123599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return status; 8133599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius } 8143599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius struct p2p_data *p2p = wpa_s->global->p2p; 8153599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius if (p2p) { 8163599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius char country[3]; 8173599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius country[0] = code[0]; 8183599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius country[1] = code[1]; 8193599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius country[2] = 0x04; 8203599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius p2p_set_country(p2p, country); 8213599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius } 8223599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 8233599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius} 8243599ac260d2eb4e40dee7738c5ed2ab44de0918cRoshan Pius 825149327590e009d96301e69772e717e227215d5acRoshan PiusSupplicantStatus StaIface::startWpsRegistrarInternal( 826149327590e009d96301e69772e717e227215d5acRoshan Pius const std::array<uint8_t, 6> &bssid, const std::string &pin) 827149327590e009d96301e69772e717e227215d5acRoshan Pius{ 828149327590e009d96301e69772e717e227215d5acRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 829149327590e009d96301e69772e717e227215d5acRoshan Pius if (wpas_wps_start_reg(wpa_s, bssid.data(), pin.c_str(), nullptr)) { 830149327590e009d96301e69772e717e227215d5acRoshan Pius return {SupplicantStatusCode::FAILURE_UNKNOWN, ""}; 831149327590e009d96301e69772e717e227215d5acRoshan Pius } 832149327590e009d96301e69772e717e227215d5acRoshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 833149327590e009d96301e69772e717e227215d5acRoshan Pius} 834149327590e009d96301e69772e717e227215d5acRoshan Pius 835149327590e009d96301e69772e717e227215d5acRoshan PiusSupplicantStatus StaIface::startWpsPbcInternal( 836149327590e009d96301e69772e717e227215d5acRoshan Pius const std::array<uint8_t, 6> &bssid) 837149327590e009d96301e69772e717e227215d5acRoshan Pius{ 838149327590e009d96301e69772e717e227215d5acRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 839149327590e009d96301e69772e717e227215d5acRoshan Pius const uint8_t *bssid_addr = 840149327590e009d96301e69772e717e227215d5acRoshan Pius is_zero_ether_addr(bssid.data()) ? nullptr : bssid.data(); 841149327590e009d96301e69772e717e227215d5acRoshan Pius if (wpas_wps_start_pbc(wpa_s, bssid_addr, 0)) { 842149327590e009d96301e69772e717e227215d5acRoshan Pius return {SupplicantStatusCode::FAILURE_UNKNOWN, ""}; 843149327590e009d96301e69772e717e227215d5acRoshan Pius } 844149327590e009d96301e69772e717e227215d5acRoshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 845149327590e009d96301e69772e717e227215d5acRoshan Pius} 846149327590e009d96301e69772e717e227215d5acRoshan Pius 847149327590e009d96301e69772e717e227215d5acRoshan PiusSupplicantStatus StaIface::startWpsPinKeypadInternal(const std::string &pin) 848149327590e009d96301e69772e717e227215d5acRoshan Pius{ 849149327590e009d96301e69772e717e227215d5acRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 850149327590e009d96301e69772e717e227215d5acRoshan Pius if (wpas_wps_start_pin( 851149327590e009d96301e69772e717e227215d5acRoshan Pius wpa_s, nullptr, pin.c_str(), 0, DEV_PW_DEFAULT)) { 852149327590e009d96301e69772e717e227215d5acRoshan Pius return {SupplicantStatusCode::FAILURE_UNKNOWN, ""}; 853149327590e009d96301e69772e717e227215d5acRoshan Pius } 854149327590e009d96301e69772e717e227215d5acRoshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 855149327590e009d96301e69772e717e227215d5acRoshan Pius} 856149327590e009d96301e69772e717e227215d5acRoshan Pius 857149327590e009d96301e69772e717e227215d5acRoshan Piusstd::pair<SupplicantStatus, std::string> StaIface::startWpsPinDisplayInternal( 858149327590e009d96301e69772e717e227215d5acRoshan Pius const std::array<uint8_t, 6> &bssid) 859149327590e009d96301e69772e717e227215d5acRoshan Pius{ 860149327590e009d96301e69772e717e227215d5acRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 861149327590e009d96301e69772e717e227215d5acRoshan Pius const uint8_t *bssid_addr = 862149327590e009d96301e69772e717e227215d5acRoshan Pius is_zero_ether_addr(bssid.data()) ? nullptr : bssid.data(); 863149327590e009d96301e69772e717e227215d5acRoshan Pius int pin = 864149327590e009d96301e69772e717e227215d5acRoshan Pius wpas_wps_start_pin(wpa_s, bssid_addr, nullptr, 0, DEV_PW_DEFAULT); 865149327590e009d96301e69772e717e227215d5acRoshan Pius if (pin < 0) { 866149327590e009d96301e69772e717e227215d5acRoshan Pius return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, ""}; 867149327590e009d96301e69772e717e227215d5acRoshan Pius } 868149327590e009d96301e69772e717e227215d5acRoshan Pius std::string pin_str; 869149327590e009d96301e69772e717e227215d5acRoshan Pius pin_str.reserve(9); 870149327590e009d96301e69772e717e227215d5acRoshan Pius snprintf(&pin_str[0], pin_str.size(), "%08d", pin); 871149327590e009d96301e69772e717e227215d5acRoshan Pius return {{SupplicantStatusCode::SUCCESS, ""}, pin_str}; 872149327590e009d96301e69772e717e227215d5acRoshan Pius} 873149327590e009d96301e69772e717e227215d5acRoshan Pius 874149327590e009d96301e69772e717e227215d5acRoshan PiusSupplicantStatus StaIface::cancelWpsInternal() 875149327590e009d96301e69772e717e227215d5acRoshan Pius{ 876149327590e009d96301e69772e717e227215d5acRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 877149327590e009d96301e69772e717e227215d5acRoshan Pius if (wpas_wps_cancel(wpa_s)) { 878149327590e009d96301e69772e717e227215d5acRoshan Pius return {SupplicantStatusCode::FAILURE_UNKNOWN, ""}; 879149327590e009d96301e69772e717e227215d5acRoshan Pius } 880149327590e009d96301e69772e717e227215d5acRoshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 881149327590e009d96301e69772e717e227215d5acRoshan Pius} 882149327590e009d96301e69772e717e227215d5acRoshan Pius 8836a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusSupplicantStatus StaIface::setWpsDeviceNameInternal(const std::string &name) 8846a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{ 8856a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return iface_config_utils::setWpsDeviceName(retrieveIfacePtr(), name); 8866a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} 8876a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 88894426e651275a0ef2261783b7eb13aa64012bbc8Roshan PiusSupplicantStatus StaIface::setWpsDeviceTypeInternal( 88994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius const std::array<uint8_t, 8> &type) 89094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{ 89194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius return iface_config_utils::setWpsDeviceType(retrieveIfacePtr(), type); 89294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius} 89394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 8946a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusSupplicantStatus StaIface::setWpsManufacturerInternal( 8956a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius const std::string &manufacturer) 8966a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{ 8976a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return iface_config_utils::setWpsManufacturer( 8986a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius retrieveIfacePtr(), manufacturer); 8996a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} 9006a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 9016a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusSupplicantStatus StaIface::setWpsModelNameInternal( 9026a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius const std::string &model_name) 9036a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{ 9046a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return iface_config_utils::setWpsModelName( 9056a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius retrieveIfacePtr(), model_name); 9066a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} 9076a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 9086a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusSupplicantStatus StaIface::setWpsModelNumberInternal( 9096a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius const std::string &model_number) 9106a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{ 9116a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return iface_config_utils::setWpsModelNumber( 9126a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius retrieveIfacePtr(), model_number); 9136a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} 9146a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 9156a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusSupplicantStatus StaIface::setWpsSerialNumberInternal( 9166a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius const std::string &serial_number) 9176a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{ 9186a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return iface_config_utils::setWpsSerialNumber( 9196a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius retrieveIfacePtr(), serial_number); 9206a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} 9216a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 9226a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusSupplicantStatus StaIface::setWpsConfigMethodsInternal(uint16_t config_methods) 9236a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{ 9246a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return iface_config_utils::setWpsConfigMethods( 9256a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius retrieveIfacePtr(), config_methods); 9266a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} 9276a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 9286a12d323192f549ce80c40c06dc3c169b61709fdRoshan PiusSupplicantStatus StaIface::setExternalSimInternal(bool useExternalSim) 9296a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius{ 9306a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius return iface_config_utils::setExternalSim( 9316a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius retrieveIfacePtr(), useExternalSim); 9326a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius} 9336a12d323192f549ce80c40c06dc3c169b61709fdRoshan Pius 93494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Piusstd::pair<SupplicantStatus, uint32_t> StaIface::addExtRadioWorkInternal( 93594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius const std::string &name, uint32_t freq_in_mhz, uint32_t timeout_in_sec) 93694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{ 93794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 93894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius auto *ework = static_cast<struct wpa_external_work *>( 93994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius os_zalloc(sizeof(struct wpa_external_work))); 94094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius if (!ework) { 94194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, 94294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius UINT32_MAX}; 94394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius } 94494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 94594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius std::string radio_work_name = kExtRadioWorkNamePrefix + name; 94694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius os_strlcpy(ework->type, radio_work_name.c_str(), sizeof(ework->type)); 94794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius ework->timeout = timeout_in_sec; 94894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius wpa_s->ext_work_id++; 94994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius if (wpa_s->ext_work_id == 0) { 95094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius wpa_s->ext_work_id++; 95194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius } 95294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius ework->id = wpa_s->ext_work_id; 95394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 95494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius if (radio_add_work( 95594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius wpa_s, freq_in_mhz, ework->type, 0, extRadioWorkStartCb, 95694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius ework)) { 95794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius os_free(ework); 95894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, 95994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius UINT32_MAX}; 96094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius } 96194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius return {SupplicantStatus{SupplicantStatusCode::SUCCESS, ""}, ework->id}; 96294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius} 96394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 96494426e651275a0ef2261783b7eb13aa64012bbc8Roshan PiusSupplicantStatus StaIface::removeExtRadioWorkInternal(uint32_t id) 96594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius{ 96694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 96794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius struct wpa_radio_work *work; 96894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius dl_list_for_each(work, &wpa_s->radio->work, struct wpa_radio_work, list) 96994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius { 97094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius if (os_strncmp( 97194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius work->type, kExtRadioWorkNamePrefix, 97294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius sizeof(kExtRadioWorkNamePrefix)) != 0) 97394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius continue; 97494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 97594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius auto *ework = 97694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius static_cast<struct wpa_external_work *>(work->ctx); 97794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius if (ework->id != id) 97894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius continue; 97994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 98094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius wpa_dbg( 98194426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius wpa_s, MSG_DEBUG, "Completed external radio work %u (%s)", 98294426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius ework->id, ework->type); 98394426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius eloop_cancel_timeout(extRadioWorkTimeoutCb, work, NULL); 98494426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius endExtRadioWork(work); 98594426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 98694426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius return {SupplicantStatusCode::SUCCESS, ""}; 98794426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius } 98894426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius return {SupplicantStatusCode::FAILURE_UNKNOWN, ""}; 98994426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius} 99094426e651275a0ef2261783b7eb13aa64012bbc8Roshan Pius 99154e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius/** 9927c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius * Retrieve the underlying |wpa_supplicant| struct 9937c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius * pointer for this iface. 9947c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius * If the underlying iface is removed, then all RPC method calls on this object 9957c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius * will return failure. 99654e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius */ 997bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Piuswpa_supplicant *StaIface::retrieveIfacePtr() 99854e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius{ 99908f74c46f8051414c23a837b68edfd507202f3f7Roshan Pius return wpa_supplicant_get_iface(wpa_global_, ifname_.c_str()); 100054e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius} 10017c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace implementation 10027c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace V1_0 10037c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace wifi 10047c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace supplicant 10057c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace hardware 10067c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace android 1007