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