sta_iface.cpp revision bc024e624ba8ae927b6ff09d571bbcb920ef42cf
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" 117c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius#include "hidl_return_macros.h" 12bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius#include "sta_iface.h" 13e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 147c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace android { 157c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace hardware { 167c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace wifi { 177c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace supplicant { 187c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace V1_0 { 197c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Piusnamespace implementation { 208702ba9091ab6dd6702afedb7021c1caa277f8d4Roshan Pius 21bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan PiusStaIface::StaIface(struct wpa_global *wpa_global, const char ifname[]) 2254e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius : wpa_global_(wpa_global), ifname_(ifname) 2354e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius{ 2454e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius} 25e4663044d3a689fb5458247e9bc0f8b58cf72fcaDmitry Shmidt 26bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan PiusReturn<void> StaIface::getName(getName_cb _hidl_cb) 2754e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius{ 287c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 297c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius if (!wpa_s) { 307c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN( 317c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius SupplicantStatusCode::FAILURE_IFACE_INVALID, ifname_); 327c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius } 337c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius 347c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::SUCCESS, ifname_); 3554e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius} 3654e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius 37bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan PiusReturn<void> StaIface::getType(getType_cb _hidl_cb) 38d6e375115b04e4ce30144a6a21ef4b1f8d3a0071Roshan Pius{ 39bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 40bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius if (!wpa_s) { 41bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius HIDL_RETURN( 42bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius SupplicantStatusCode::FAILURE_IFACE_INVALID, 43bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius IfaceType::STA); 44bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius } 45bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius 46bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius HIDL_RETURN(SupplicantStatusCode::SUCCESS, IfaceType::STA); 47bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius} 48bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius 49bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan PiusReturn<void> StaIface::addNetwork(addNetwork_cb _hidl_cb) 50bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius{ 51bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius android::sp<ISupplicantStaNetwork> network; 52d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 537c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius if (!wpa_s) { 547c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN( 557c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius SupplicantStatusCode::FAILURE_IFACE_INVALID, network); 567c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius } 57d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 58f745df8121ceec43d19edba801ab7b3d1c689a2aRoshan Pius struct wpa_ssid *ssid = wpa_supplicant_add_network(wpa_s); 59d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius if (!ssid) { 607c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN, network); 61d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius } 62d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 6357ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius HidlManager *hidl_manager = HidlManager::getInstance(); 6457ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius if (!hidl_manager || 65bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius hidl_manager->getStaNetworkHidlObjectByIfnameAndNetworkId( 667c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius wpa_s->ifname, ssid->id, &network)) { 677c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN, network); 68d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius } 697c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius 707c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::SUCCESS, network); 71d6e375115b04e4ce30144a6a21ef4b1f8d3a0071Roshan Pius} 72d6e375115b04e4ce30144a6a21ef4b1f8d3a0071Roshan Pius 73bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan PiusReturn<void> StaIface::removeNetwork(uint32_t id, removeNetwork_cb _hidl_cb) 74d6e375115b04e4ce30144a6a21ef4b1f8d3a0071Roshan Pius{ 75d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 767c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius if (!wpa_s) { 777c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::FAILURE_IFACE_INVALID); 787c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius } 79d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 807c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius int result = wpa_supplicant_remove_network(wpa_s, id); 81f745df8121ceec43d19edba801ab7b3d1c689a2aRoshan Pius if (result == -1) { 827c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::FAILURE_NETWORK_UNKNOWN); 83d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius } 84f745df8121ceec43d19edba801ab7b3d1c689a2aRoshan Pius 857c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius if (result != 0) { 867c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN); 87d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius } 887c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius 897c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::SUCCESS); 90d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius} 91d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 92bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan PiusReturn<void> StaIface::getNetwork(uint32_t id, getNetwork_cb _hidl_cb) 93d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius{ 94bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius android::sp<ISupplicantStaNetwork> network; 95d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 967c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius if (!wpa_s) { 977c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN( 987c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius SupplicantStatusCode::FAILURE_IFACE_INVALID, network); 997c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius } 100d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 1017c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius struct wpa_ssid *ssid = wpa_config_get_network(wpa_s->conf, id); 102d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius if (!ssid) { 1037c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN( 1047c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius SupplicantStatusCode::FAILURE_NETWORK_UNKNOWN, network); 105d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius } 106d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius 10757ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius HidlManager *hidl_manager = HidlManager::getInstance(); 10857ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius if (!hidl_manager || 109bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius hidl_manager->getStaNetworkHidlObjectByIfnameAndNetworkId( 1107c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius wpa_s->ifname, ssid->id, &network)) { 1117c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN, network); 1127c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius } 1137c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius 1147c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::SUCCESS, network); 1157c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} 1167c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius 117bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan PiusReturn<void> StaIface::listNetworks(listNetworks_cb _hidl_cb) 1187c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius{ 1197c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius std::vector<uint32_t> network_ids; 1207c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius 1217c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 1227c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius if (!wpa_s) { 1237c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN( 1247c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius SupplicantStatusCode::FAILURE_IFACE_INVALID, network_ids); 125d385445171074ae070c5ddce94344ec0f06d15b4Roshan Pius } 1267c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius 1277c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius for (struct wpa_ssid *wpa_ssid = wpa_s->conf->ssid; wpa_ssid; 1287c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius wpa_ssid = wpa_ssid->next) { 1297c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius network_ids.emplace_back(wpa_ssid->id); 1307c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius } 1317c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius 1327c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::SUCCESS, network_ids); 133d6e375115b04e4ce30144a6a21ef4b1f8d3a0071Roshan Pius} 134d6e375115b04e4ce30144a6a21ef4b1f8d3a0071Roshan Pius 135bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan PiusReturn<void> StaIface::registerCallback( 136bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius const sp<ISupplicantStaIfaceCallback> &callback, 137bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius registerCallback_cb _hidl_cb) 1380470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius{ 1390470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 1407c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius if (!wpa_s) { 1417c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::FAILURE_IFACE_INVALID); 1427c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius } 1438702ba9091ab6dd6702afedb7021c1caa277f8d4Roshan Pius 14457ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius HidlManager *hidl_manager = HidlManager::getInstance(); 14557ffbcfc79cd9f7a8389bfcbabea0bced5ed4dbaRoshan Pius if (!hidl_manager || 146bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Pius hidl_manager->addStaIfaceCallbackHidlObject(ifname_, callback)) { 1477c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN); 1480470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius } 1497c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius 1507c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::SUCCESS); 1510470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius} 1520470cc8ceeb1a152594d90ce65cb13b6b907751bRoshan Pius 153bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan PiusReturn<void> StaIface::reassociate(reassociate_cb _hidl_cb) 154f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius{ 155f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 1567c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius if (!wpa_s) { 1577c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::FAILURE_IFACE_INVALID); 1587c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius } 159f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius 160f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) { 1617c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::FAILURE_IFACE_DISABLED); 162f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius } 1637c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius 1647c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::SUCCESS); 165f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius} 166f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius 167bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan PiusReturn<void> StaIface::reconnect(reconnect_cb _hidl_cb) 168f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius{ 169f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 1707c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius if (!wpa_s) { 1717c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::FAILURE_IFACE_INVALID); 1727c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius } 173f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius 174f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) { 1757c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::FAILURE_IFACE_DISABLED); 176f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius } 177f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius if (!wpa_s->disconnected) { 1787c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN( 1797c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius SupplicantStatusCode::FAILURE_IFACE_NOT_DISCONNECTED); 180f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius } 1817c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius 182f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius wpas_request_connection(wpa_s); 1837c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius 1847c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::SUCCESS); 185f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius} 186f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius 187bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan PiusReturn<void> StaIface::disconnect(disconnect_cb _hidl_cb) 188f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius{ 189f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 1907c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius if (!wpa_s) { 1917c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::FAILURE_IFACE_INVALID); 1927c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius } 193f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius 194f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) { 1957c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::FAILURE_IFACE_DISABLED); 196f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius } 1977c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius 198f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius wpas_request_disconnection(wpa_s); 1997c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius 2007c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::SUCCESS); 201f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius} 202f4e46cf18fbc77404ba7148a5de7334b602f6e55Roshan Pius 203bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan PiusReturn<void> StaIface::setPowerSave(bool enable, setPowerSave_cb _hidl_cb) 204390ba2881ef621db480848b7e50b93d61542206aRoshan Pius{ 205390ba2881ef621db480848b7e50b93d61542206aRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 2067c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius if (!wpa_s) { 2077c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::FAILURE_IFACE_INVALID); 2087c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius } 2097c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius 210390ba2881ef621db480848b7e50b93d61542206aRoshan Pius if (wpa_drv_set_p2p_powersave(wpa_s, enable, -1, -1)) { 2117c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN); 212390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } 2137c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius 2147c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::SUCCESS); 215390ba2881ef621db480848b7e50b93d61542206aRoshan Pius} 216390ba2881ef621db480848b7e50b93d61542206aRoshan Pius 217bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan PiusReturn<void> StaIface::initiateTdlsDiscover( 2187c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius const hidl_array<uint8_t, 6 /* 6 */> &mac_address, 2197c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius initiateTdlsDiscover_cb _hidl_cb) 220390ba2881ef621db480848b7e50b93d61542206aRoshan Pius{ 221390ba2881ef621db480848b7e50b93d61542206aRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 2227c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius if (!wpa_s) { 2237c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::FAILURE_IFACE_INVALID); 2247c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius } 225390ba2881ef621db480848b7e50b93d61542206aRoshan Pius 2267c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius if (!mac_address.data()) { 2277c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::FAILURE_ARGS_INVALID); 228390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } 2297c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius 230390ba2881ef621db480848b7e50b93d61542206aRoshan Pius int ret; 231390ba2881ef621db480848b7e50b93d61542206aRoshan Pius const u8 *peer = mac_address.data(); 232390ba2881ef621db480848b7e50b93d61542206aRoshan Pius if (wpa_tdls_is_external_setup(wpa_s->wpa)) { 233390ba2881ef621db480848b7e50b93d61542206aRoshan Pius ret = wpa_tdls_send_discovery_request(wpa_s->wpa, peer); 234390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } else { 235390ba2881ef621db480848b7e50b93d61542206aRoshan Pius ret = wpa_drv_tdls_oper(wpa_s, TDLS_DISCOVERY_REQ, peer); 236390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } 237390ba2881ef621db480848b7e50b93d61542206aRoshan Pius if (ret) { 2387c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN); 239390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } 2407c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius 2417c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::SUCCESS); 242390ba2881ef621db480848b7e50b93d61542206aRoshan Pius} 243390ba2881ef621db480848b7e50b93d61542206aRoshan Pius 244bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan PiusReturn<void> StaIface::initiateTdlsSetup( 2457c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius const hidl_array<uint8_t, 6 /* 6 */> &mac_address, 2467c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius initiateTdlsSetup_cb _hidl_cb) 247390ba2881ef621db480848b7e50b93d61542206aRoshan Pius{ 248390ba2881ef621db480848b7e50b93d61542206aRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 2497c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius if (!wpa_s) { 2507c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::FAILURE_IFACE_INVALID); 2517c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius } 252390ba2881ef621db480848b7e50b93d61542206aRoshan Pius 2537c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius if (!mac_address.data()) { 2547c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::FAILURE_ARGS_INVALID); 255390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } 2567c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius 257390ba2881ef621db480848b7e50b93d61542206aRoshan Pius int ret; 258390ba2881ef621db480848b7e50b93d61542206aRoshan Pius const u8 *peer = mac_address.data(); 259390ba2881ef621db480848b7e50b93d61542206aRoshan Pius if (wpa_tdls_is_external_setup(wpa_s->wpa) && 260390ba2881ef621db480848b7e50b93d61542206aRoshan Pius !(wpa_s->conf->tdls_external_control)) { 261390ba2881ef621db480848b7e50b93d61542206aRoshan Pius wpa_tdls_remove(wpa_s->wpa, peer); 262390ba2881ef621db480848b7e50b93d61542206aRoshan Pius ret = wpa_tdls_start(wpa_s->wpa, peer); 263390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } else { 264390ba2881ef621db480848b7e50b93d61542206aRoshan Pius ret = wpa_drv_tdls_oper(wpa_s, TDLS_SETUP, peer); 265390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } 266390ba2881ef621db480848b7e50b93d61542206aRoshan Pius if (ret) { 2677c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN); 268390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } 2697c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius 2707c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::SUCCESS); 271390ba2881ef621db480848b7e50b93d61542206aRoshan Pius} 272390ba2881ef621db480848b7e50b93d61542206aRoshan Pius 273bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan PiusReturn<void> StaIface::initiateTdlsTeardown( 2747c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius const hidl_array<uint8_t, 6 /* 6 */> &mac_address, 2757c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius initiateTdlsTeardown_cb _hidl_cb) 276390ba2881ef621db480848b7e50b93d61542206aRoshan Pius{ 277390ba2881ef621db480848b7e50b93d61542206aRoshan Pius struct wpa_supplicant *wpa_s = retrieveIfacePtr(); 2787c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius if (!wpa_s) { 2797c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::FAILURE_IFACE_INVALID); 2807c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius } 281390ba2881ef621db480848b7e50b93d61542206aRoshan Pius 2827c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius if (!mac_address.data()) { 2837c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::FAILURE_ARGS_INVALID); 284390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } 2857c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius 286390ba2881ef621db480848b7e50b93d61542206aRoshan Pius int ret; 287390ba2881ef621db480848b7e50b93d61542206aRoshan Pius const u8 *peer = mac_address.data(); 288390ba2881ef621db480848b7e50b93d61542206aRoshan Pius if (wpa_tdls_is_external_setup(wpa_s->wpa) && 289390ba2881ef621db480848b7e50b93d61542206aRoshan Pius !(wpa_s->conf->tdls_external_control)) { 290390ba2881ef621db480848b7e50b93d61542206aRoshan Pius ret = wpa_tdls_teardown_link( 291390ba2881ef621db480848b7e50b93d61542206aRoshan Pius wpa_s->wpa, peer, WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED); 292390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } else { 293390ba2881ef621db480848b7e50b93d61542206aRoshan Pius ret = wpa_drv_tdls_oper(wpa_s, TDLS_TEARDOWN, peer); 294390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } 2957c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius 296390ba2881ef621db480848b7e50b93d61542206aRoshan Pius if (ret) { 2977c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN); 298390ba2881ef621db480848b7e50b93d61542206aRoshan Pius } 2997c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius 3007c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius HIDL_RETURN(SupplicantStatusCode::SUCCESS); 301390ba2881ef621db480848b7e50b93d61542206aRoshan Pius} 302390ba2881ef621db480848b7e50b93d61542206aRoshan Pius 30354e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius/** 3047c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius * Retrieve the underlying |wpa_supplicant| struct 3057c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius * pointer for this iface. 3067c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius * If the underlying iface is removed, then all RPC method calls on this object 3077c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius * will return failure. 30854e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius */ 309bc024e624ba8ae927b6ff09d571bbcb920ef42cfRoshan Piuswpa_supplicant *StaIface::retrieveIfacePtr() 31054e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius{ 31154e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius return wpa_supplicant_get_iface( 31254e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius (struct wpa_global *)wpa_global_, ifname_.c_str()); 31354e763ada0bed9bf2c48415e82c5f04db23a3330Roshan Pius} 3147c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius 3157c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace implementation 3167c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace V1_0 3177c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace wifi 3187c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace supplicant 3197c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace hardware 3207c0ebf20edf34a20127008cdff2a8efe0346a9ffRoshan Pius} // namespace android 321