Home | History | Annotate | Download | only in 1.0
      1 /*
      2  * hidl interface for wpa_supplicant daemon
      3  * Copyright (c) 2004-2016, Jouni Malinen <j (at) w1.fi>
      4  * Copyright (c) 2004-2016, Roshan Pius <rpius (at) 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 
     14 namespace android {
     15 namespace hardware {
     16 namespace wifi {
     17 namespace supplicant {
     18 namespace V1_0 {
     19 namespace implementation {
     20 using hidl_return_util::validateAndCall;
     21 
     22 // These are hardcoded for android.
     23 const char Supplicant::kDriverName[] = "nl80211";
     24 const char Supplicant::kConfigFilePath[] =
     25     "/data/misc/wifi/wpa_supplicant.conf";
     26 
     27 Supplicant::Supplicant(struct wpa_global* global) : wpa_global_(global) {}
     28 bool Supplicant::isValid()
     29 {
     30 	// This top level object cannot be invalidated.
     31 	return true;
     32 }
     33 
     34 Return<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 
     42 Return<void> Supplicant::listInterfaces(listInterfaces_cb _hidl_cb)
     43 {
     44 	return validateAndCall(
     45 	    this, SupplicantStatusCode::FAILURE_IFACE_INVALID,
     46 	    &Supplicant::listInterfacesInternal, _hidl_cb);
     47 }
     48 
     49 Return<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 
     57 Return<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 
     67 Return<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 
     75 Return<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 
     82 Return<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 
     89 Return<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 
     96 std::pair<SupplicantStatus, sp<ISupplicantIface>>
     97 Supplicant::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 		return {{SupplicantStatusCode::SUCCESS, ""}, iface};
    115 	} else {
    116 		android::sp<ISupplicantStaIface> iface;
    117 		if (!hidl_manager ||
    118 		    hidl_manager->getStaIfaceHidlObjectByIfname(
    119 			wpa_s->ifname, &iface)) {
    120 			return {{SupplicantStatusCode::FAILURE_UNKNOWN, ""},
    121 				iface};
    122 		}
    123 		return {{SupplicantStatusCode::SUCCESS, ""}, iface};
    124 	}
    125 }
    126 
    127 std::pair<SupplicantStatus, std::vector<ISupplicant::IfaceInfo>>
    128 Supplicant::listInterfacesInternal()
    129 {
    130 	std::vector<ISupplicant::IfaceInfo> ifaces;
    131 	for (struct wpa_supplicant* wpa_s = wpa_global_->ifaces; wpa_s;
    132 	     wpa_s = wpa_s->next) {
    133 		if (wpa_s->global->p2p_init_wpa_s == wpa_s) {
    134 			ifaces.emplace_back(ISupplicant::IfaceInfo{
    135 			    IfaceType::P2P, wpa_s->ifname});
    136 		} else {
    137 			ifaces.emplace_back(ISupplicant::IfaceInfo{
    138 			    IfaceType::STA, wpa_s->ifname});
    139 		}
    140 	}
    141 	return {{SupplicantStatusCode::SUCCESS, ""}, std::move(ifaces)};
    142 }
    143 
    144 SupplicantStatus Supplicant::registerCallbackInternal(
    145     const sp<ISupplicantCallback>& callback)
    146 {
    147 	HidlManager* hidl_manager = HidlManager::getInstance();
    148 	if (!hidl_manager ||
    149 	    hidl_manager->addSupplicantCallbackHidlObject(callback)) {
    150 		return {SupplicantStatusCode::FAILURE_UNKNOWN, ""};
    151 	}
    152 	return {SupplicantStatusCode::SUCCESS, ""};
    153 }
    154 
    155 SupplicantStatus Supplicant::setDebugParamsInternal(
    156     ISupplicant::DebugLevel level, bool show_timestamp, bool show_keys)
    157 {
    158 	if (wpa_supplicant_set_debug_params(
    159 		wpa_global_, static_cast<uint32_t>(level), show_timestamp,
    160 		show_keys)) {
    161 		return {SupplicantStatusCode::FAILURE_UNKNOWN, ""};
    162 	}
    163 	return {SupplicantStatusCode::SUCCESS, ""};
    164 }
    165 
    166 SupplicantStatus Supplicant::setConcurrencyPriorityInternal(IfaceType type)
    167 {
    168 	if (type == IfaceType::STA) {
    169 		wpa_global_->conc_pref =
    170 		    wpa_global::wpa_conc_pref::WPA_CONC_PREF_STA;
    171 	} else if (type == IfaceType::P2P) {
    172 		wpa_global_->conc_pref =
    173 		    wpa_global::wpa_conc_pref::WPA_CONC_PREF_P2P;
    174 	} else {
    175 		return {SupplicantStatusCode::FAILURE_ARGS_INVALID, ""};
    176 	}
    177 	return SupplicantStatus{SupplicantStatusCode::SUCCESS, ""};
    178 }
    179 }  // namespace implementation
    180 }  // namespace V1_0
    181 }  // namespace wifi
    182 }  // namespace supplicant
    183 }  // namespace hardware
    184 }  // namespace android
    185