blob: 089645ff705c4743d2f8ed8455187c92bacdaac6 [file] [log] [blame]
Dmitry Shmidte4663042016-04-04 10:07:49 -07001/*
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>
5 *
6 * This software may be distributed under the terms of the BSD license.
7 * See README for more details.
8 */
9
10#include <binder/IPCThreadState.h>
Dmitry Shmidte4663042016-04-04 10:07:49 -070011#include <binder/IServiceManager.h>
Dmitry Shmidt7f2c7532016-08-15 09:48:12 -070012#include <binder/ProcessState.h>
Dmitry Shmidte4663042016-04-04 10:07:49 -070013
14#include "binder_manager.h"
15
16extern "C" {
Dmitry Shmidte4663042016-04-04 10:07:49 -070017#include "binder.h"
18#include "binder_i.h"
Dmitry Shmidt7f2c7532016-08-15 09:48:12 -070019#include "utils/common.h"
20#include "utils/eloop.h"
21#include "utils/includes.h"
Dmitry Shmidte4663042016-04-04 10:07:49 -070022}
23
Roshan Piusac9845a2016-08-04 09:56:34 -070024void wpas_binder_sock_handler(int /* sock */, void * /* eloop_ctx */, void *sock_ctx)
Dmitry Shmidte4663042016-04-04 10:07:49 -070025{
Dmitry Shmidt7f2c7532016-08-15 09:48:12 -070026 struct wpas_binder_priv *priv = (wpas_binder_priv *)sock_ctx;
Dmitry Shmidt7f2c7532016-08-15 09:48:12 -070027 wpa_printf(
28 MSG_DEBUG, "Processing binder events on FD %d", priv->binder_fd);
Dmitry Shmidte4663042016-04-04 10:07:49 -070029 android::IPCThreadState::self()->handlePolledCommands();
30}
31
Dmitry Shmidt7f2c7532016-08-15 09:48:12 -070032struct wpas_binder_priv *wpas_binder_init(struct wpa_global *global)
Dmitry Shmidte4663042016-04-04 10:07:49 -070033{
34 struct wpas_binder_priv *priv;
35 wpa_supplicant_binder::BinderManager *binder_manager;
36
Dmitry Shmidt7f2c7532016-08-15 09:48:12 -070037 priv = (wpas_binder_priv *)os_zalloc(sizeof(*priv));
Dmitry Shmidte4663042016-04-04 10:07:49 -070038 if (!priv)
39 return NULL;
40 priv->global = global;
41
Roshan Pius54e763a2016-07-06 15:41:53 -070042 wpa_printf(MSG_DEBUG, "Initing binder control");
43
Dmitry Shmidte4663042016-04-04 10:07:49 -070044 android::ProcessState::self()->setThreadPoolMaxThreadCount(0);
45 android::IPCThreadState::self()->disableBackgroundScheduling(true);
46 android::IPCThreadState::self()->setupPolling(&priv->binder_fd);
Dmitry Shmidte4663042016-04-04 10:07:49 -070047 if (priv->binder_fd < 0)
48 goto err;
Roshan Pius54e763a2016-07-06 15:41:53 -070049
50 wpa_printf(
51 MSG_INFO, "Processing binder events on FD %d", priv->binder_fd);
Dmitry Shmidte4663042016-04-04 10:07:49 -070052 /* Look for read events from the binder socket in the eloop. */
Dmitry Shmidt7f2c7532016-08-15 09:48:12 -070053 if (eloop_register_read_sock(
54 priv->binder_fd, wpas_binder_sock_handler, global, priv) < 0)
Dmitry Shmidte4663042016-04-04 10:07:49 -070055 goto err;
56
57 binder_manager = wpa_supplicant_binder::BinderManager::getInstance();
58 if (!binder_manager)
59 goto err;
60 binder_manager->registerBinderService(global);
61 /* We may not need to store this binder manager reference in the
62 * global data strucure because we've made it a singleton class. */
Dmitry Shmidt7f2c7532016-08-15 09:48:12 -070063 priv->binder_manager = (void *)binder_manager;
Dmitry Shmidte4663042016-04-04 10:07:49 -070064
65 return priv;
Dmitry Shmidte4663042016-04-04 10:07:49 -070066err:
67 wpas_binder_deinit(priv);
68 return NULL;
69}
70
Dmitry Shmidte4663042016-04-04 10:07:49 -070071void wpas_binder_deinit(struct wpas_binder_priv *priv)
72{
73 if (!priv)
74 return;
75
Roshan Pius54e763a2016-07-06 15:41:53 -070076 wpa_printf(MSG_DEBUG, "Deiniting binder control");
77
Dmitry Shmidte4663042016-04-04 10:07:49 -070078 wpa_supplicant_binder::BinderManager::destroyInstance();
79 eloop_unregister_read_sock(priv->binder_fd);
80 android::IPCThreadState::shutdown();
Roshan Piusac9845a2016-08-04 09:56:34 -070081 os_free(priv);
Dmitry Shmidte4663042016-04-04 10:07:49 -070082}
83
Dmitry Shmidte4663042016-04-04 10:07:49 -070084int wpas_binder_register_interface(struct wpa_supplicant *wpa_s)
85{
Roshan Piuse8d0d162016-08-01 13:09:26 -070086 if (!wpa_s || !wpa_s->global->binder)
Dmitry Shmidte4663042016-04-04 10:07:49 -070087 return 1;
88
Roshan Pius54e763a2016-07-06 15:41:53 -070089 wpa_printf(
90 MSG_DEBUG, "Registering interface to binder control: %s",
91 wpa_s->ifname);
92
Dmitry Shmidte4663042016-04-04 10:07:49 -070093 wpa_supplicant_binder::BinderManager *binder_manager =
Dmitry Shmidt7f2c7532016-08-15 09:48:12 -070094 wpa_supplicant_binder::BinderManager::getInstance();
Dmitry Shmidte4663042016-04-04 10:07:49 -070095 if (!binder_manager)
96 return 1;
97
98 return binder_manager->registerInterface(wpa_s);
99}
100
Dmitry Shmidte4663042016-04-04 10:07:49 -0700101int wpas_binder_unregister_interface(struct wpa_supplicant *wpa_s)
102{
Roshan Piuse8d0d162016-08-01 13:09:26 -0700103 if (!wpa_s || !wpa_s->global->binder)
Dmitry Shmidte4663042016-04-04 10:07:49 -0700104 return 1;
105
Roshan Pius54e763a2016-07-06 15:41:53 -0700106 wpa_printf(
107 MSG_DEBUG, "Deregistering interface from binder control: %s",
108 wpa_s->ifname);
109
Dmitry Shmidte4663042016-04-04 10:07:49 -0700110 wpa_supplicant_binder::BinderManager *binder_manager =
Dmitry Shmidt7f2c7532016-08-15 09:48:12 -0700111 wpa_supplicant_binder::BinderManager::getInstance();
Dmitry Shmidte4663042016-04-04 10:07:49 -0700112 if (!binder_manager)
113 return 1;
114
115 return binder_manager->unregisterInterface(wpa_s);
116}
Roshan Piusd3854452016-07-07 16:46:41 -0700117
118int wpas_binder_register_network(
119 struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
120{
Roshan Piuse8d0d162016-08-01 13:09:26 -0700121 if (!wpa_s || !wpa_s->global->binder || !ssid)
Roshan Piusd3854452016-07-07 16:46:41 -0700122 return 1;
123
124 wpa_printf(
125 MSG_DEBUG, "Registering network to binder control: %d", ssid->id);
126
127 wpa_supplicant_binder::BinderManager *binder_manager =
128 wpa_supplicant_binder::BinderManager::getInstance();
129 if (!binder_manager)
130 return 1;
131
132 return binder_manager->registerNetwork(wpa_s, ssid);
133}
134
135int wpas_binder_unregister_network(
136 struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
137{
Roshan Piuse8d0d162016-08-01 13:09:26 -0700138 if (!wpa_s || !wpa_s->global->binder || !ssid)
Roshan Piusd3854452016-07-07 16:46:41 -0700139 return 1;
140
141 wpa_printf(
142 MSG_DEBUG, "Deregistering network from binder control: %d",
143 ssid->id);
144
145 wpa_supplicant_binder::BinderManager *binder_manager =
146 wpa_supplicant_binder::BinderManager::getInstance();
147 if (!binder_manager)
148 return 1;
149
150 return binder_manager->unregisterNetwork(wpa_s, ssid);
151}
Roshan Piuse8d0d162016-08-01 13:09:26 -0700152
153int wpas_binder_notify_state_changed(struct wpa_supplicant *wpa_s)
154{
Roshan Piusac9845a2016-08-04 09:56:34 -0700155 if (!wpa_s || !wpa_s->global->binder)
Roshan Piuse8d0d162016-08-01 13:09:26 -0700156 return 1;
157
158 wpa_printf(
159 MSG_DEBUG, "Notifying state change event to binder control: %d",
160 wpa_s->wpa_state);
161
162 wpa_supplicant_binder::BinderManager *binder_manager =
163 wpa_supplicant_binder::BinderManager::getInstance();
164 if (!binder_manager)
165 return 1;
166
167 return binder_manager->notifyStateChange(wpa_s);
168}