1 /*
2 * hidl interface for wpa_supplicant daemon
3 * Copyright (c) 2004-2018, Jouni Malinen <j@w1.fi>
4 * Copyright (c) 2004-2018, 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 <hwbinder/IPCThreadState.h>
11 #include <hidl/HidlTransportSupport.h>
12
13 #include "hostapd.h"
14
15 extern "C"
16 {
17 #include "hidl.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::IPCThreadState;
25 using android::hardware::wifi::hostapd::V1_0::IHostapd;
26 using android::hardware::wifi::hostapd::V1_0::implementation::Hostapd;
27
28 // This file is a bridge between the hostapd code written in 'C' and the HIDL
29 // interface in C++. So, using "C" style static globals here!
30 static int hidl_fd = -1;
31 static android::sp<IHostapd> service;
32
hostapd_hidl_sock_handler(int,void *,void *)33 void hostapd_hidl_sock_handler(
34 int /* sock */, void * /* eloop_ctx */, void * /* sock_ctx */)
35 {
36 IPCThreadState::self()->handlePolledCommands();
37 }
38
hostapd_hidl_init(struct hapd_interfaces * interfaces)39 int hostapd_hidl_init(struct hapd_interfaces *interfaces)
40 {
41 wpa_printf(MSG_DEBUG, "Initing hidl control");
42
43 IPCThreadState::self()->disableBackgroundScheduling(true);
44 IPCThreadState::self()->setupPolling(&hidl_fd);
45 if (hidl_fd < 0)
46 goto err;
47
48 wpa_printf(MSG_INFO, "Processing hidl events on FD %d", hidl_fd);
49 // Look for read events from the hidl socket in the eloop.
50 if (eloop_register_read_sock(
51 hidl_fd, hostapd_hidl_sock_handler, interfaces, NULL) < 0)
52 goto err;
53 service = new Hostapd(interfaces);
54 if (!service)
55 goto err;
56 if (service->registerAsService() != android::NO_ERROR)
57 goto err;
58 return 0;
59 err:
60 hostapd_hidl_deinit(interfaces);
61 return -1;
62 }
63
hostapd_hidl_deinit(struct hapd_interfaces * interfaces)64 void hostapd_hidl_deinit(struct hapd_interfaces *interfaces)
65 {
66 wpa_printf(MSG_DEBUG, "Deiniting hidl control");
67 eloop_unregister_read_sock(hidl_fd);
68 IPCThreadState::shutdown();
69 hidl_fd = -1;
70 service.clear();
71 }
72