blob: f32ceb90c6837c31da4b079753c8a29597661921 [file] [log] [blame]
Dmitry Shmidte4663042016-04-04 10:07:49 -07001/*
Roshan Pius57ffbcf2016-09-27 09:12:46 -07002 * hidl interface for wpa_supplicant daemon
Dmitry Shmidte4663042016-04-04 10:07:49 -07003 * Copyright (c) 2004-2016, Jouni Malinen <j@w1.fi>
4 * Copyright (c) 2004-2016, Roshan Pius <rpius@google.com>
5 *
6 * This software may be distributed under the terms of the BSD license.
7 * See README for more details.
8 */
9
Roshan Pius57ffbcf2016-09-27 09:12:46 -070010#include "hidl_manager.h"
Roshan Pius7c0ebf22016-09-20 15:11:56 -070011#include "hidl_return_macros.h"
12#include "supplicant.h"
Dmitry Shmidte4663042016-04-04 10:07:49 -070013
Roshan Pius7c0ebf22016-09-20 15:11:56 -070014namespace android {
15namespace hardware {
16namespace wifi {
17namespace supplicant {
18namespace V1_0 {
19namespace implementation {
Dmitry Shmidte4663042016-04-04 10:07:49 -070020
Roshan Pius7c0ebf22016-09-20 15:11:56 -070021// These are hardcoded for android.
22const char Supplicant::kDriverName[] = "nl80211";
23const char Supplicant::kConfigFilePath[] =
24 "/data/misc/wifi/wpa_supplicant.conf";
25
26Supplicant::Supplicant(struct wpa_global* global) : wpa_global_(global) {}
Roshan Pius7c0ebf22016-09-20 15:11:56 -070027Return<void> Supplicant::getInterface(
Roshan Piuse286edf2016-11-01 16:56:42 -070028 const IfaceInfo& iface_info, getInterface_cb _hidl_cb)
Dmitry Shmidte4663042016-04-04 10:07:49 -070029{
Roshan Pius7c0ebf22016-09-20 15:11:56 -070030 struct wpa_supplicant* wpa_s =
Roshan Piuse286edf2016-11-01 16:56:42 -070031 wpa_supplicant_get_iface(wpa_global_, iface_info.name.c_str());
Roshan Pius32c15e22016-07-07 13:46:39 -070032 if (!wpa_s) {
Roshan Piuse286edf2016-11-01 16:56:42 -070033 HIDL_RETURN(
34 SupplicantStatusCode::FAILURE_IFACE_UNKNOWN, nullptr);
Roshan Pius32c15e22016-07-07 13:46:39 -070035 }
Dmitry Shmidte4663042016-04-04 10:07:49 -070036
Roshan Pius7c0ebf22016-09-20 15:11:56 -070037 HidlManager* hidl_manager = HidlManager::getInstance();
Roshan Piuse286edf2016-11-01 16:56:42 -070038 if (iface_info.type == IfaceType::P2P) {
39 android::sp<ISupplicantP2pIface> iface;
40 if (!hidl_manager ||
41 hidl_manager->getP2pIfaceHidlObjectByIfname(
42 wpa_s->ifname, &iface)) {
43 HIDL_RETURN(
44 SupplicantStatusCode::FAILURE_UNKNOWN, iface);
45 }
Dmitry Shmidte4663042016-04-04 10:07:49 -070046
Roshan Piuse286edf2016-11-01 16:56:42 -070047 HIDL_RETURN(SupplicantStatusCode::SUCCESS, iface);
48 } else {
49 android::sp<ISupplicantStaIface> iface;
50 if (!hidl_manager ||
51 hidl_manager->getStaIfaceHidlObjectByIfname(
52 wpa_s->ifname, &iface)) {
53 HIDL_RETURN(
54 SupplicantStatusCode::FAILURE_UNKNOWN, iface);
55 }
56
57 HIDL_RETURN(SupplicantStatusCode::SUCCESS, iface);
58 }
Dmitry Shmidte4663042016-04-04 10:07:49 -070059}
60
Roshan Pius7c0ebf22016-09-20 15:11:56 -070061Return<void> Supplicant::listInterfaces(listInterfaces_cb _hidl_cb)
Roshan Piusc9422c72016-07-11 10:18:22 -070062{
Roshan Piuse286edf2016-11-01 16:56:42 -070063 std::vector<ISupplicant::IfaceInfo> ifaces;
Roshan Pius7c0ebf22016-09-20 15:11:56 -070064 for (struct wpa_supplicant* wpa_s = wpa_global_->ifaces; wpa_s;
65 wpa_s = wpa_s->next) {
Roshan Piuse286edf2016-11-01 16:56:42 -070066 if (wpa_s->global->p2p_init_wpa_s == wpa_s) {
67 ifaces.emplace_back({IfaceType::P2P, wpa_s->ifname});
68 } else {
69 ifaces.emplace_back({IfaceType::STA, wpa_s->ifname});
70 }
Roshan Piusc9422c72016-07-11 10:18:22 -070071 }
Roshan Pius7c0ebf22016-09-20 15:11:56 -070072
Roshan Piuse286edf2016-11-01 16:56:42 -070073 HIDL_RETURN(SupplicantStatusCode::SUCCESS, ifaces);
Roshan Piusc9422c72016-07-11 10:18:22 -070074}
75
Roshan Pius7c0ebf22016-09-20 15:11:56 -070076Return<void> Supplicant::registerCallback(
77 const sp<ISupplicantCallback>& callback, registerCallback_cb _hidl_cb)
Roshan Piusc9422c72016-07-11 10:18:22 -070078{
Roshan Pius7c0ebf22016-09-20 15:11:56 -070079 HidlManager* hidl_manager = HidlManager::getInstance();
Roshan Pius57ffbcf2016-09-27 09:12:46 -070080 if (!hidl_manager ||
81 hidl_manager->addSupplicantCallbackHidlObject(callback)) {
Roshan Pius7c0ebf22016-09-20 15:11:56 -070082 HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
Roshan Pius0470cc82016-07-14 16:37:07 -070083 }
Roshan Pius0470cc82016-07-14 16:37:07 -070084
Roshan Pius7c0ebf22016-09-20 15:11:56 -070085 HIDL_RETURN(SupplicantStatusCode::SUCCESS);
Roshan Piusc9422c72016-07-11 10:18:22 -070086}
87
Roshan Pius7c0ebf22016-09-20 15:11:56 -070088Return<void> Supplicant::setDebugParams(
89 ISupplicant::DebugLevel level, bool show_timestamp, bool show_keys,
90 setDebugParams_cb _hidl_cb)
Roshan Piusc9422c72016-07-11 10:18:22 -070091{
Roshan Pius7c0ebf22016-09-20 15:11:56 -070092 if (wpa_supplicant_set_debug_params(
93 wpa_global_, static_cast<uint32_t>(level), show_timestamp,
94 show_keys)) {
95 HIDL_RETURN(SupplicantStatusCode::FAILURE_UNKNOWN);
Roshan Piusc9422c72016-07-11 10:18:22 -070096 }
Roshan Pius7c0ebf22016-09-20 15:11:56 -070097
98 HIDL_RETURN(SupplicantStatusCode::SUCCESS);
Roshan Piusc9422c72016-07-11 10:18:22 -070099}
Roshan Pius7c0ebf22016-09-20 15:11:56 -0700100
101Return<ISupplicant::DebugLevel> Supplicant::getDebugLevel()
102{
103 return (ISupplicant::DebugLevel)wpa_debug_level;
104}
105
106Return<bool> Supplicant::isDebugShowTimestampEnabled()
107{
108 return (wpa_debug_timestamp ? true : false);
109}
110
111Return<bool> Supplicant::isDebugShowKeysEnabled()
112{
113 return (wpa_debug_show_keys ? true : false);
114}
115} // namespace implementation
116} // namespace V1_0
117} // namespace wifi
118} // namespace supplicant
119} // namespace hardware
120} // namespace android