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