supplicant.cpp revision 6ca7b54de22e93958b79bae0a4428107e08cb778
1/* 2 * hidl interface for wpa_supplicant daemon 3 * 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 10#include "hidl_manager.h" 11#include "hidl_return_util.h" 12#include "supplicant.h" 13 14namespace android { 15namespace hardware { 16namespace wifi { 17namespace supplicant { 18namespace V1_1 { 19namespace implementation { 20using hidl_return_util::validateAndCall; 21 22// These are hardcoded for android. 23const char Supplicant::kDriverName[] = "nl80211"; 24const char Supplicant::kConfigFilePath[] = 25 "/data/misc/wifi/wpa_supplicant.conf"; 26 27Supplicant::Supplicant(struct wpa_global* global) : wpa_global_(global) {} 28bool Supplicant::isValid() 29{ 30 // This top level object cannot be invalidated. 31 return true; 32} 33 34Return<void> Supplicant::getInterface( 35 const IfaceInfo& iface_info, getInterface_cb _hidl_cb) 36{ 37 return validateAndCall( 38 this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 39 &Supplicant::getInterfaceInternal, _hidl_cb, iface_info); 40} 41 42Return<void> Supplicant::listInterfaces(listInterfaces_cb _hidl_cb) 43{ 44 return validateAndCall( 45 this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 46 &Supplicant::listInterfacesInternal, _hidl_cb); 47} 48 49Return<void> Supplicant::registerCallback( 50 const sp<ISupplicantCallback>& callback, registerCallback_cb _hidl_cb) 51{ 52 return validateAndCall( 53 this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 54 &Supplicant::registerCallbackInternal, _hidl_cb, callback); 55} 56 57Return<void> Supplicant::setDebugParams( 58 ISupplicant::DebugLevel level, bool show_timestamp, bool show_keys, 59 setDebugParams_cb _hidl_cb) 60{ 61 return validateAndCall( 62 this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 63 &Supplicant::setDebugParamsInternal, _hidl_cb, level, 64 show_timestamp, show_keys); 65} 66 67Return<void> Supplicant::setConcurrencyPriority( 68 IfaceType type, setConcurrencyPriority_cb _hidl_cb) 69{ 70 return validateAndCall( 71 this, SupplicantStatusCode::FAILURE_IFACE_INVALID, 72 &Supplicant::setConcurrencyPriorityInternal, _hidl_cb, type); 73} 74 75Return<ISupplicant::DebugLevel> Supplicant::getDebugLevel() 76{ 77 // TODO: Add SupplicantStatus in this method return for uniformity with 78 // the other methods in supplicant HIDL interface. 79 return (ISupplicant::DebugLevel)wpa_debug_level; 80} 81 82Return<bool> Supplicant::isDebugShowTimestampEnabled() 83{ 84 // TODO: Add SupplicantStatus in this method return for uniformity with 85 // the other methods in supplicant HIDL interface. 86 return ((wpa_debug_timestamp != 0) ? true : false); 87} 88 89Return<bool> Supplicant::isDebugShowKeysEnabled() 90{ 91 // TODO: Add SupplicantStatus in this method return for uniformity with 92 // the other methods in supplicant HIDL interface. 93 return ((wpa_debug_show_keys != 0) ? true : false); 94} 95 96std::pair<SupplicantStatus, sp<ISupplicantIface>> 97Supplicant::getInterfaceInternal(const IfaceInfo& iface_info) 98{ 99 struct wpa_supplicant* wpa_s = 100 wpa_supplicant_get_iface(wpa_global_, iface_info.name.c_str()); 101 if (!wpa_s) { 102 return {{SupplicantStatusCode::FAILURE_IFACE_UNKNOWN, ""}, 103 nullptr}; 104 } 105 HidlManager* hidl_manager = HidlManager::getInstance(); 106 if (iface_info.type == IfaceType::P2P) { 107 android::sp<ISupplicantP2pIface> iface; 108 if (!hidl_manager || 109 hidl_manager->getP2pIfaceHidlObjectByIfname( 110 wpa_s->ifname, &iface)) { 111 return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, 112 iface}; 113 } 114 // Set this flag true here, since there is no HIDL initialize method for the p2p 115 // config, and the supplicant interface is not ready when the p2p iface is created. 116 wpa_s->conf->persistent_reconnect = true; 117 return {{SupplicantStatusCode::SUCCESS, ""}, iface}; 118 } else { 119 android::sp<ISupplicantStaIface> iface; 120 if (!hidl_manager || 121 hidl_manager->getStaIfaceHidlObjectByIfname( 122 wpa_s->ifname, &iface)) { 123 return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""}, 124 iface}; 125 } 126 return {{SupplicantStatusCode::SUCCESS, ""}, iface}; 127 } 128} 129 130std::pair<SupplicantStatus, std::vector<ISupplicant::IfaceInfo>> 131Supplicant::listInterfacesInternal() 132{ 133 std::vector<ISupplicant::IfaceInfo> ifaces; 134 for (struct wpa_supplicant* wpa_s = wpa_global_->ifaces; wpa_s; 135 wpa_s = wpa_s->next) { 136 if (wpa_s->global->p2p_init_wpa_s == wpa_s) { 137 ifaces.emplace_back(ISupplicant::IfaceInfo{ 138 IfaceType::P2P, wpa_s->ifname}); 139 } else { 140 ifaces.emplace_back(ISupplicant::IfaceInfo{ 141 IfaceType::STA, wpa_s->ifname}); 142 } 143 } 144 return {{SupplicantStatusCode::SUCCESS, ""}, std::move(ifaces)}; 145} 146 147SupplicantStatus Supplicant::registerCallbackInternal( 148 const sp<ISupplicantCallback>& callback) 149{ 150 HidlManager* hidl_manager = HidlManager::getInstance(); 151 if (!hidl_manager || 152 hidl_manager->addSupplicantCallbackHidlObject(callback)) { 153 return {SupplicantStatusCode::FAILURE_UNKNOWN, ""}; 154 } 155 return {SupplicantStatusCode::SUCCESS, ""}; 156} 157 158SupplicantStatus Supplicant::setDebugParamsInternal( 159 ISupplicant::DebugLevel level, bool show_timestamp, bool show_keys) 160{ 161 if (wpa_supplicant_set_debug_params( 162 wpa_global_, static_cast<uint32_t>(level), show_timestamp, 163 show_keys)) { 164 return {SupplicantStatusCode::FAILURE_UNKNOWN, ""}; 165 } 166 return {SupplicantStatusCode::SUCCESS, ""}; 167} 168 169SupplicantStatus Supplicant::setConcurrencyPriorityInternal(IfaceType type) 170{ 171 if (type == IfaceType::STA) { 172 wpa_global_->conc_pref = 173 wpa_global::wpa_conc_pref::WPA_CONC_PREF_STA; 174 } else if (type == IfaceType::P2P) { 175 wpa_global_->conc_pref = 176 wpa_global::wpa_conc_pref::WPA_CONC_PREF_P2P; 177 } else { 178 return {SupplicantStatusCode::FAILURE_ARGS_INVALID, ""}; 179 } 180 return SupplicantStatus{SupplicantStatusCode::SUCCESS, ""}; 181} 182} // namespace implementation 183} // namespace V1_1 184} // namespace wifi 185} // namespace supplicant 186} // namespace hardware 187} // namespace android 188