2 * binder interface for wpa_supplicant daemon
3 * Copyright (c) 2004-2016, Jouni Malinen <j@w1.fi>
4 * Copyright (c) 2004-2016, Roshan Pius <rpius@google.com>
6 * This software may be distributed under the terms of the BSD license.
7 * See README for more details.
10 #include <binder/IPCThreadState.h>
11 #include <binder/IServiceManager.h>
12 #include <binder/ProcessState.h>
14 #include "binder_manager.h"
19 #include "utils/common.h"
20 #include "utils/eloop.h"
21 #include "utils/includes.h"
24 void wpas_binder_sock_handler(int sock, void *eloop_ctx, void *sock_ctx)
26 struct wpa_global *global = (wpa_global *)eloop_ctx;
27 struct wpas_binder_priv *priv = (wpas_binder_priv *)sock_ctx;
30 MSG_DEBUG, "Processing binder events on FD %d", priv->binder_fd);
31 android::IPCThreadState::self()->handlePolledCommands();
34 struct wpas_binder_priv *wpas_binder_init(struct wpa_global *global)
36 struct wpas_binder_priv *priv;
37 wpa_supplicant_binder::BinderManager *binder_manager;
39 priv = (wpas_binder_priv *)os_zalloc(sizeof(*priv));
42 priv->global = global;
44 android::ProcessState::self()->setThreadPoolMaxThreadCount(0);
45 android::IPCThreadState::self()->disableBackgroundScheduling(true);
46 android::IPCThreadState::self()->setupPolling(&priv->binder_fd);
47 wpa_printf(MSG_INFO, "Process binder events on FD %d", priv->binder_fd);
48 if (priv->binder_fd < 0)
50 /* Look for read events from the binder socket in the eloop. */
51 if (eloop_register_read_sock(
52 priv->binder_fd, wpas_binder_sock_handler, global, priv) < 0)
55 binder_manager = wpa_supplicant_binder::BinderManager::getInstance();
58 binder_manager->registerBinderService(global);
59 /* We may not need to store this binder manager reference in the
60 * global data strucure because we've made it a singleton class. */
61 priv->binder_manager = (void *)binder_manager;
66 wpas_binder_deinit(priv);
70 void wpas_binder_deinit(struct wpas_binder_priv *priv)
75 wpa_supplicant_binder::BinderManager::destroyInstance();
76 eloop_unregister_read_sock(priv->binder_fd);
77 android::IPCThreadState::shutdown();
80 int wpas_binder_register_interface(struct wpa_supplicant *wpa_s)
82 if (!wpa_s->global->binder)
85 wpa_supplicant_binder::BinderManager *binder_manager =
86 wpa_supplicant_binder::BinderManager::getInstance();
90 return binder_manager->registerInterface(wpa_s);
93 int wpas_binder_unregister_interface(struct wpa_supplicant *wpa_s)
95 if (!wpa_s->global->binder)
98 wpa_supplicant_binder::BinderManager *binder_manager =
99 wpa_supplicant_binder::BinderManager::getInstance();
103 return binder_manager->unregisterInterface(wpa_s);