blob: 1f80c7d3012fd1f47d9f0c9ae5854e86ea809fbf [file] [log] [blame]
Roshan Piuscc817562017-12-22 14:45:05 -08001/*
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
15extern "C"
16{
17#include "hidl.h"
18#include "utils/common.h"
19#include "utils/eloop.h"
20#include "utils/includes.h"
21}
22
23using android::hardware::configureRpcThreadpool;
24using android::hardware::IPCThreadState;
25using android::hardware::wifi::hostapd::V1_0::IHostapd;
26using 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!
30static int hidl_fd = -1;
31static android::sp<IHostapd> service;
32
33void hostapd_hidl_sock_handler(
34 int /* sock */, void * /* eloop_ctx */, void * /* sock_ctx */)
35{
36 IPCThreadState::self()->handlePolledCommands();
37}
38
39int 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;
59err:
60 hostapd_hidl_deinit(interfaces);
61 return -1;
62}
63
64void 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}