/* * hidl interface for wpa_supplicant daemon * Copyright (c) 2004-2018, Jouni Malinen <j@w1.fi> * Copyright (c) 2004-2018, Roshan Pius <rpius@google.com> * * This software may be distributed under the terms of the BSD license. * See README for more details. */ #include <hwbinder/IPCThreadState.h> #include <hidl/HidlTransportSupport.h> #include "hostapd.h" extern "C" { #include "hidl.h" #include "utils/common.h" #include "utils/eloop.h" #include "utils/includes.h" } using android::hardware::configureRpcThreadpool; using android::hardware::IPCThreadState; using android::hardware::wifi::hostapd::V1_1::IHostapd; using android::hardware::wifi::hostapd::V1_1::implementation::Hostapd; // This file is a bridge between the hostapd code written in 'C' and the HIDL // interface in C++. So, using "C" style static globals here! static int hidl_fd = -1; static android::sp<IHostapd> service; void hostapd_hidl_sock_handler( int /* sock */, void * /* eloop_ctx */, void * /* sock_ctx */) { IPCThreadState::self()->handlePolledCommands(); } int hostapd_hidl_init(struct hapd_interfaces *interfaces) { wpa_printf(MSG_DEBUG, "Initing hidl control"); IPCThreadState::self()->setupPolling(&hidl_fd); if (hidl_fd < 0) goto err; wpa_printf(MSG_INFO, "Processing hidl events on FD %d", hidl_fd); // Look for read events from the hidl socket in the eloop. if (eloop_register_read_sock( hidl_fd, hostapd_hidl_sock_handler, interfaces, NULL) < 0) goto err; service = new Hostapd(interfaces); if (!service) goto err; if (service->registerAsService() != android::NO_ERROR) goto err; return 0; err: hostapd_hidl_deinit(interfaces); return -1; } void hostapd_hidl_deinit(struct hapd_interfaces *interfaces) { wpa_printf(MSG_DEBUG, "Deiniting hidl control"); eloop_unregister_read_sock(hidl_fd); IPCThreadState::shutdown(); hidl_fd = -1; service.clear(); }