Home | History | Annotate | Download | only in 1.1
      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 <hwbinder/IPCThreadState.h>
     11 
     12 #include <hidl/HidlTransportSupport.h>
     13 #include "hidl_manager.h"
     14 
     15 extern "C" {
     16 #include "hidl.h"
     17 #include "hidl_i.h"
     18 #include "utils/common.h"
     19 #include "utils/eloop.h"
     20 #include "utils/includes.h"
     21 }
     22 
     23 using android::hardware::configureRpcThreadpool;
     24 using android::hardware::setupTransportPolling;
     25 using android::hardware::handleTransportPoll;
     26 using android::hardware::wifi::supplicant::V1_1::implementation::HidlManager;
     27 
     28 void wpas_hidl_sock_handler(
     29     int sock, void * /* eloop_ctx */, void * /* sock_ctx */)
     30 {
     31 	handleTransportPoll(sock);
     32 }
     33 
     34 struct wpas_hidl_priv *wpas_hidl_init(struct wpa_global *global)
     35 {
     36 	struct wpas_hidl_priv *priv;
     37 	HidlManager *hidl_manager;
     38 
     39 	priv = (wpas_hidl_priv *)os_zalloc(sizeof(*priv));
     40 	if (!priv)
     41 		return NULL;
     42 	priv->global = global;
     43 
     44 	wpa_printf(MSG_DEBUG, "Initing hidl control");
     45 
     46 	configureRpcThreadpool(1, true /* callerWillJoin */);
     47 	priv->hidl_fd = setupTransportPolling();
     48 	if (priv->hidl_fd < 0)
     49 		goto err;
     50 
     51 	wpa_printf(MSG_INFO, "Processing hidl events on FD %d", priv->hidl_fd);
     52 	// Look for read events from the hidl socket in the eloop.
     53 	if (eloop_register_read_sock(
     54 		priv->hidl_fd, wpas_hidl_sock_handler, global, priv) < 0)
     55 		goto err;
     56 
     57 	hidl_manager = HidlManager::getInstance();
     58 	if (!hidl_manager)
     59 		goto err;
     60 	hidl_manager->registerHidlService(global);
     61 	// We may not need to store this hidl manager reference in the
     62 	// global data strucure because we've made it a singleton class.
     63 	priv->hidl_manager = (void *)hidl_manager;
     64 
     65 	return priv;
     66 err:
     67 	wpas_hidl_deinit(priv);
     68 	return NULL;
     69 }
     70 
     71 void wpas_hidl_deinit(struct wpas_hidl_priv *priv)
     72 {
     73 	if (!priv)
     74 		return;
     75 
     76 	wpa_printf(MSG_DEBUG, "Deiniting hidl control");
     77 
     78 	HidlManager::destroyInstance();
     79 	eloop_unregister_read_sock(priv->hidl_fd);
     80 	os_free(priv);
     81 }
     82 
     83 int wpas_hidl_register_interface(struct wpa_supplicant *wpa_s)
     84 {
     85 	if (!wpa_s || !wpa_s->global->hidl)
     86 		return 1;
     87 
     88 	wpa_printf(
     89 	    MSG_DEBUG, "Registering interface to hidl control: %s",
     90 	    wpa_s->ifname);
     91 
     92 	HidlManager *hidl_manager = HidlManager::getInstance();
     93 	if (!hidl_manager)
     94 		return 1;
     95 
     96 	return hidl_manager->registerInterface(wpa_s);
     97 }
     98 
     99 int wpas_hidl_unregister_interface(struct wpa_supplicant *wpa_s)
    100 {
    101 	if (!wpa_s || !wpa_s->global->hidl)
    102 		return 1;
    103 
    104 	wpa_printf(
    105 	    MSG_DEBUG, "Deregistering interface from hidl control: %s",
    106 	    wpa_s->ifname);
    107 
    108 	HidlManager *hidl_manager = HidlManager::getInstance();
    109 	if (!hidl_manager)
    110 		return 1;
    111 
    112 	return hidl_manager->unregisterInterface(wpa_s);
    113 }
    114 
    115 int wpas_hidl_register_network(
    116     struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
    117 {
    118 	if (!wpa_s || !wpa_s->global->hidl || !ssid)
    119 		return 1;
    120 
    121 	wpa_printf(
    122 	    MSG_DEBUG, "Registering network to hidl control: %d", ssid->id);
    123 
    124 	HidlManager *hidl_manager = HidlManager::getInstance();
    125 	if (!hidl_manager)
    126 		return 1;
    127 
    128 	return hidl_manager->registerNetwork(wpa_s, ssid);
    129 }
    130 
    131 int wpas_hidl_unregister_network(
    132     struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
    133 {
    134 	if (!wpa_s || !wpa_s->global->hidl || !ssid)
    135 		return 1;
    136 
    137 	wpa_printf(
    138 	    MSG_DEBUG, "Deregistering network from hidl control: %d", ssid->id);
    139 
    140 	HidlManager *hidl_manager = HidlManager::getInstance();
    141 	if (!hidl_manager)
    142 		return 1;
    143 
    144 	return hidl_manager->unregisterNetwork(wpa_s, ssid);
    145 }
    146 
    147 int wpas_hidl_notify_state_changed(struct wpa_supplicant *wpa_s)
    148 {
    149 	if (!wpa_s || !wpa_s->global->hidl)
    150 		return 1;
    151 
    152 	wpa_printf(
    153 	    MSG_DEBUG, "Notifying state change event to hidl control: %d",
    154 	    wpa_s->wpa_state);
    155 
    156 	HidlManager *hidl_manager = HidlManager::getInstance();
    157 	if (!hidl_manager)
    158 		return 1;
    159 
    160 	return hidl_manager->notifyStateChange(wpa_s);
    161 }
    162 
    163 int wpas_hidl_notify_network_request(
    164     struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
    165     enum wpa_ctrl_req_type rtype, const char *default_txt)
    166 {
    167 	if (!wpa_s || !wpa_s->global->hidl || !ssid)
    168 		return 1;
    169 
    170 	wpa_printf(
    171 	    MSG_DEBUG, "Notifying network request to hidl control: %d",
    172 	    ssid->id);
    173 
    174 	HidlManager *hidl_manager = HidlManager::getInstance();
    175 	if (!hidl_manager)
    176 		return 1;
    177 
    178 	return hidl_manager->notifyNetworkRequest(
    179 	    wpa_s, ssid, rtype, default_txt);
    180 }
    181 
    182 void wpas_hidl_notify_anqp_query_done(
    183     struct wpa_supplicant *wpa_s, const u8 *bssid, const char *result,
    184     const struct wpa_bss_anqp *anqp)
    185 {
    186 	if (!wpa_s || !wpa_s->global->hidl || !bssid || !result || !anqp)
    187 		return;
    188 
    189 	wpa_printf(
    190 	    MSG_DEBUG,
    191 	    "Notifying ANQP query done to hidl control: " MACSTR "result: %s",
    192 	    MAC2STR(bssid), result);
    193 
    194 	HidlManager *hidl_manager = HidlManager::getInstance();
    195 	if (!hidl_manager)
    196 		return;
    197 
    198 	hidl_manager->notifyAnqpQueryDone(wpa_s, bssid, result, anqp);
    199 }
    200 
    201 void wpas_hidl_notify_hs20_icon_query_done(
    202     struct wpa_supplicant *wpa_s, const u8 *bssid, const char *file_name,
    203     const u8 *image, u32 image_length)
    204 {
    205 	if (!wpa_s || !wpa_s->global->hidl || !bssid || !file_name || !image)
    206 		return;
    207 
    208 	wpa_printf(
    209 	    MSG_DEBUG, "Notifying HS20 icon query done to hidl control: " MACSTR
    210 		       "file_name: %s",
    211 	    MAC2STR(bssid), file_name);
    212 
    213 	HidlManager *hidl_manager = HidlManager::getInstance();
    214 	if (!hidl_manager)
    215 		return;
    216 
    217 	hidl_manager->notifyHs20IconQueryDone(
    218 	    wpa_s, bssid, file_name, image, image_length);
    219 }
    220 
    221 void wpas_hidl_notify_hs20_rx_subscription_remediation(
    222     struct wpa_supplicant *wpa_s, const char *url, u8 osu_method)
    223 {
    224 	if (!wpa_s || !wpa_s->global->hidl || !url)
    225 		return;
    226 
    227 	wpa_printf(
    228 	    MSG_DEBUG,
    229 	    "Notifying HS20 subscription remediation rx to hidl control: %s",
    230 	    url);
    231 
    232 	HidlManager *hidl_manager = HidlManager::getInstance();
    233 	if (!hidl_manager)
    234 		return;
    235 
    236 	hidl_manager->notifyHs20RxSubscriptionRemediation(
    237 	    wpa_s, url, osu_method);
    238 }
    239 
    240 void wpas_hidl_notify_hs20_rx_deauth_imminent_notice(
    241     struct wpa_supplicant *wpa_s, u8 code, u16 reauth_delay, const char *url)
    242 {
    243 	if (!wpa_s || !wpa_s->global->hidl || !url)
    244 		return;
    245 
    246 	wpa_printf(
    247 	    MSG_DEBUG,
    248 	    "Notifying HS20 deauth imminent notice rx to hidl control: %s",
    249 	    url);
    250 
    251 	HidlManager *hidl_manager = HidlManager::getInstance();
    252 	if (!hidl_manager)
    253 		return;
    254 
    255 	hidl_manager->notifyHs20RxDeauthImminentNotice(
    256 	    wpa_s, code, reauth_delay, url);
    257 }
    258 
    259 void wpas_hidl_notify_disconnect_reason(struct wpa_supplicant *wpa_s)
    260 {
    261 	if (!wpa_s)
    262 		return;
    263 
    264 	wpa_printf(
    265 	    MSG_DEBUG, "Notifying disconnect reason to hidl control: %d",
    266 	    wpa_s->disconnect_reason);
    267 
    268 	HidlManager *hidl_manager = HidlManager::getInstance();
    269 	if (!hidl_manager)
    270 		return;
    271 
    272 	hidl_manager->notifyDisconnectReason(wpa_s);
    273 }
    274 
    275 void wpas_hidl_notify_assoc_reject(struct wpa_supplicant *wpa_s)
    276 {
    277 	if (!wpa_s)
    278 		return;
    279 
    280 	wpa_printf(
    281 	    MSG_DEBUG, "Notifying assoc reject to hidl control: %d",
    282 	    wpa_s->assoc_status_code);
    283 
    284 	HidlManager *hidl_manager = HidlManager::getInstance();
    285 	if (!hidl_manager)
    286 		return;
    287 
    288 	hidl_manager->notifyAssocReject(wpa_s);
    289 }
    290 
    291 void wpas_hidl_notify_auth_timeout(struct wpa_supplicant *wpa_s)
    292 {
    293 	if (!wpa_s)
    294 		return;
    295 
    296 	wpa_printf(MSG_DEBUG, "Notifying auth timeout to hidl control");
    297 
    298 	HidlManager *hidl_manager = HidlManager::getInstance();
    299 	if (!hidl_manager)
    300 		return;
    301 
    302 	hidl_manager->notifyAuthTimeout(wpa_s);
    303 }
    304 
    305 void wpas_hidl_notify_bssid_changed(struct wpa_supplicant *wpa_s)
    306 {
    307 	if (!wpa_s)
    308 		return;
    309 
    310 	wpa_printf(MSG_DEBUG, "Notifying bssid changed to hidl control");
    311 
    312 	HidlManager *hidl_manager = HidlManager::getInstance();
    313 	if (!hidl_manager)
    314 		return;
    315 
    316 	hidl_manager->notifyBssidChanged(wpa_s);
    317 }
    318 
    319 void wpas_hidl_notify_wps_event_fail(
    320     struct wpa_supplicant *wpa_s, uint8_t *peer_macaddr, uint16_t config_error,
    321     uint16_t error_indication)
    322 {
    323 	if (!wpa_s || !peer_macaddr)
    324 		return;
    325 
    326 	wpa_printf(
    327 	    MSG_DEBUG, "Notifying Wps event fail to hidl control: %d, %d",
    328 	    config_error, error_indication);
    329 
    330 	HidlManager *hidl_manager = HidlManager::getInstance();
    331 	if (!hidl_manager)
    332 		return;
    333 
    334 	hidl_manager->notifyWpsEventFail(
    335 	    wpa_s, peer_macaddr, config_error, error_indication);
    336 }
    337 
    338 void wpas_hidl_notify_wps_event_success(struct wpa_supplicant *wpa_s)
    339 {
    340 	if (!wpa_s)
    341 		return;
    342 
    343 	wpa_printf(MSG_DEBUG, "Notifying Wps event success to hidl control");
    344 
    345 	HidlManager *hidl_manager = HidlManager::getInstance();
    346 	if (!hidl_manager)
    347 		return;
    348 
    349 	hidl_manager->notifyWpsEventSuccess(wpa_s);
    350 }
    351 
    352 void wpas_hidl_notify_wps_event_pbc_overlap(struct wpa_supplicant *wpa_s)
    353 {
    354 	if (!wpa_s)
    355 		return;
    356 
    357 	wpa_printf(
    358 	    MSG_DEBUG, "Notifying Wps event PBC overlap to hidl control");
    359 
    360 	HidlManager *hidl_manager = HidlManager::getInstance();
    361 	if (!hidl_manager)
    362 		return;
    363 
    364 	hidl_manager->notifyWpsEventPbcOverlap(wpa_s);
    365 }
    366 
    367 void wpas_hidl_notify_p2p_device_found(
    368     struct wpa_supplicant *wpa_s, const u8 *addr,
    369     const struct p2p_peer_info *info, const u8 *peer_wfd_device_info,
    370     u8 peer_wfd_device_info_len)
    371 {
    372 	if (!wpa_s || !addr || !info)
    373 		return;
    374 
    375 	wpa_printf(
    376 	    MSG_DEBUG, "Notifying P2P device found to hidl control " MACSTR,
    377 	    MAC2STR(info->p2p_device_addr));
    378 
    379 	HidlManager *hidl_manager = HidlManager::getInstance();
    380 	if (!hidl_manager)
    381 		return;
    382 
    383 	hidl_manager->notifyP2pDeviceFound(
    384 	    wpa_s, addr, info, peer_wfd_device_info, peer_wfd_device_info_len);
    385 }
    386 
    387 void wpas_hidl_notify_p2p_device_lost(
    388     struct wpa_supplicant *wpa_s, const u8 *p2p_device_addr)
    389 {
    390 	if (!wpa_s || !p2p_device_addr)
    391 		return;
    392 
    393 	wpa_printf(
    394 	    MSG_DEBUG, "Notifying P2P device lost to hidl control " MACSTR,
    395 	    MAC2STR(p2p_device_addr));
    396 
    397 	HidlManager *hidl_manager = HidlManager::getInstance();
    398 	if (!hidl_manager)
    399 		return;
    400 
    401 	hidl_manager->notifyP2pDeviceLost(wpa_s, p2p_device_addr);
    402 }
    403 
    404 void wpas_hidl_notify_p2p_find_stopped(struct wpa_supplicant *wpa_s)
    405 {
    406 	if (!wpa_s)
    407 		return;
    408 
    409 	wpa_printf(MSG_DEBUG, "Notifying P2P find stop to hidl control");
    410 
    411 	HidlManager *hidl_manager = HidlManager::getInstance();
    412 	if (!hidl_manager)
    413 		return;
    414 
    415 	hidl_manager->notifyP2pFindStopped(wpa_s);
    416 }
    417 
    418 void wpas_hidl_notify_p2p_go_neg_req(
    419     struct wpa_supplicant *wpa_s, const u8 *src_addr, u16 dev_passwd_id,
    420     u8 go_intent)
    421 {
    422 	if (!wpa_s || !src_addr)
    423 		return;
    424 
    425 	wpa_printf(
    426 	    MSG_DEBUG,
    427 	    "Notifying P2P GO negotiation request to hidl control " MACSTR,
    428 	    MAC2STR(src_addr));
    429 
    430 	HidlManager *hidl_manager = HidlManager::getInstance();
    431 	if (!hidl_manager)
    432 		return;
    433 
    434 	hidl_manager->notifyP2pGoNegReq(
    435 	    wpa_s, src_addr, dev_passwd_id, go_intent);
    436 }
    437 
    438 void wpas_hidl_notify_p2p_go_neg_completed(
    439     struct wpa_supplicant *wpa_s, const struct p2p_go_neg_results *res)
    440 {
    441 	if (!wpa_s || !res)
    442 		return;
    443 
    444 	wpa_printf(
    445 	    MSG_DEBUG,
    446 	    "Notifying P2P GO negotiation completed to hidl control: %d",
    447 	    res->status);
    448 
    449 	HidlManager *hidl_manager = HidlManager::getInstance();
    450 	if (!hidl_manager)
    451 		return;
    452 
    453 	hidl_manager->notifyP2pGoNegCompleted(wpa_s, res);
    454 }
    455 
    456 void wpas_hidl_notify_p2p_group_formation_failure(
    457     struct wpa_supplicant *wpa_s, const char *reason)
    458 {
    459 	if (!wpa_s || !reason)
    460 		return;
    461 
    462 	wpa_printf(
    463 	    MSG_DEBUG,
    464 	    "Notifying P2P Group formation failure to hidl control: %s",
    465 	    reason);
    466 
    467 	HidlManager *hidl_manager = HidlManager::getInstance();
    468 	if (!hidl_manager)
    469 		return;
    470 
    471 	hidl_manager->notifyP2pGroupFormationFailure(wpa_s, reason);
    472 }
    473 
    474 void wpas_hidl_notify_p2p_group_started(
    475     struct wpa_supplicant *wpa_s, const struct wpa_ssid *ssid, int persistent,
    476     int client)
    477 {
    478 	if (!wpa_s || !ssid)
    479 		return;
    480 
    481 	wpa_printf(
    482 	    MSG_DEBUG, "Notifying P2P Group start to hidl control: %d",
    483 	    ssid->id);
    484 
    485 	HidlManager *hidl_manager = HidlManager::getInstance();
    486 	if (!hidl_manager)
    487 		return;
    488 
    489 	hidl_manager->notifyP2pGroupStarted(wpa_s, ssid, persistent, client);
    490 }
    491 
    492 void wpas_hidl_notify_p2p_group_removed(
    493     struct wpa_supplicant *wpa_s, const struct wpa_ssid *ssid, const char *role)
    494 {
    495 	if (!wpa_s || !ssid || !role)
    496 		return;
    497 
    498 	wpa_printf(
    499 	    MSG_DEBUG, "Notifying P2P Group removed to hidl control: %d",
    500 	    ssid->id);
    501 
    502 	HidlManager *hidl_manager = HidlManager::getInstance();
    503 	if (!hidl_manager)
    504 		return;
    505 
    506 	hidl_manager->notifyP2pGroupRemoved(wpa_s, ssid, role);
    507 }
    508 
    509 void wpas_hidl_notify_p2p_invitation_received(
    510     struct wpa_supplicant *wpa_s, const u8 *sa, const u8 *go_dev_addr,
    511     const u8 *bssid, int id, int op_freq)
    512 {
    513 	if (!wpa_s || !sa || !go_dev_addr || !bssid)
    514 		return;
    515 
    516 	wpa_printf(
    517 	    MSG_DEBUG,
    518 	    "Notifying P2P invitation received to hidl control: %d " MACSTR, id,
    519 	    MAC2STR(bssid));
    520 
    521 	HidlManager *hidl_manager = HidlManager::getInstance();
    522 	if (!hidl_manager)
    523 		return;
    524 
    525 	hidl_manager->notifyP2pInvitationReceived(
    526 	    wpa_s, sa, go_dev_addr, bssid, id, op_freq);
    527 }
    528 
    529 void wpas_hidl_notify_p2p_invitation_result(
    530     struct wpa_supplicant *wpa_s, int status, const u8 *bssid)
    531 {
    532 	if (!wpa_s)
    533 		return;
    534 	if (bssid) {
    535 		wpa_printf(
    536 			MSG_DEBUG,
    537 			"Notifying P2P invitation result to hidl control: " MACSTR,
    538 			MAC2STR(bssid));
    539 	} else {
    540 		wpa_printf(
    541 			MSG_DEBUG,
    542 			"Notifying P2P invitation result to hidl control: NULL bssid");
    543 	}
    544 
    545 	HidlManager *hidl_manager = HidlManager::getInstance();
    546 	if (!hidl_manager)
    547 		return;
    548 
    549 	hidl_manager->notifyP2pInvitationResult(wpa_s, status, bssid);
    550 }
    551 
    552 void wpas_hidl_notify_p2p_provision_discovery(
    553     struct wpa_supplicant *wpa_s, const u8 *dev_addr, int request,
    554     enum p2p_prov_disc_status status, u16 config_methods,
    555     unsigned int generated_pin)
    556 {
    557 	if (!wpa_s || !dev_addr)
    558 		return;
    559 
    560 	wpa_printf(
    561 	    MSG_DEBUG,
    562 	    "Notifying P2P provision discovery to hidl control " MACSTR,
    563 	    MAC2STR(dev_addr));
    564 
    565 	HidlManager *hidl_manager = HidlManager::getInstance();
    566 	if (!hidl_manager)
    567 		return;
    568 
    569 	hidl_manager->notifyP2pProvisionDiscovery(
    570 	    wpa_s, dev_addr, request, status, config_methods, generated_pin);
    571 }
    572 
    573 void wpas_hidl_notify_p2p_sd_response(
    574     struct wpa_supplicant *wpa_s, const u8 *sa, u16 update_indic,
    575     const u8 *tlvs, size_t tlvs_len)
    576 {
    577 	if (!wpa_s || !sa || !tlvs)
    578 		return;
    579 
    580 	wpa_printf(
    581 	    MSG_DEBUG,
    582 	    "Notifying P2P service discovery response to hidl control " MACSTR,
    583 	    MAC2STR(sa));
    584 
    585 	HidlManager *hidl_manager = HidlManager::getInstance();
    586 	if (!hidl_manager)
    587 		return;
    588 
    589 	hidl_manager->notifyP2pSdResponse(
    590 	    wpa_s, sa, update_indic, tlvs, tlvs_len);
    591 }
    592 
    593 void wpas_hidl_notify_ap_sta_authorized(
    594     struct wpa_supplicant *wpa_s, const u8 *sta, const u8 *p2p_dev_addr)
    595 {
    596 	if (!wpa_s || !sta)
    597 		return;
    598 
    599 	wpa_printf(
    600 	    MSG_DEBUG,
    601 	    "Notifying P2P AP STA authorized to hidl control " MACSTR,
    602 	    MAC2STR(sta));
    603 
    604 	HidlManager *hidl_manager = HidlManager::getInstance();
    605 	if (!hidl_manager)
    606 		return;
    607 
    608 	hidl_manager->notifyApStaAuthorized(wpa_s, sta, p2p_dev_addr);
    609 }
    610 
    611 void wpas_hidl_notify_ap_sta_deauthorized(
    612     struct wpa_supplicant *wpa_s, const u8 *sta, const u8 *p2p_dev_addr)
    613 {
    614 	if (!wpa_s || !sta)
    615 		return;
    616 
    617 	wpa_printf(
    618 	    MSG_DEBUG,
    619 	    "Notifying P2P AP STA deauthorized to hidl control " MACSTR,
    620 	    MAC2STR(sta));
    621 
    622 	HidlManager *hidl_manager = HidlManager::getInstance();
    623 	if (!hidl_manager)
    624 		return;
    625 
    626 	hidl_manager->notifyApStaDeauthorized(wpa_s, sta, p2p_dev_addr);
    627 }
    628 
    629 void wpas_hidl_notify_eap_error(
    630     struct wpa_supplicant *wpa_s, int error_code)
    631 {
    632 	if (!wpa_s)
    633 		return;
    634 
    635 	wpa_printf(
    636 	    MSG_DEBUG,
    637             "Notifying EAP Error: %d ", error_code);
    638 
    639 	HidlManager *hidl_manager = HidlManager::getInstance();
    640 	if (!hidl_manager)
    641 		return;
    642 
    643 	hidl_manager->notifyEapError(wpa_s, error_code);
    644 }
    645 
    646