blob: 6a45754a75295b4ec556cb4ca864fbad2bc2ff81 [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 Pius32f9f5f2016-08-15 14:44:22 -070024void wpas_binder_sock_handler(
25 int /* sock */, void * /* eloop_ctx */, void *sock_ctx)
Dmitry Shmidte4663042016-04-04 10:07:49 -070026{
Dmitry Shmidt7f2c7532016-08-15 09:48:12 -070027 struct wpas_binder_priv *priv = (wpas_binder_priv *)sock_ctx;
Dmitry Shmidt7f2c7532016-08-15 09:48:12 -070028 wpa_printf(
29 MSG_DEBUG, "Processing binder events on FD %d", priv->binder_fd);
Dmitry Shmidte4663042016-04-04 10:07:49 -070030 android::IPCThreadState::self()->handlePolledCommands();
31}
32
Dmitry Shmidt7f2c7532016-08-15 09:48:12 -070033struct wpas_binder_priv *wpas_binder_init(struct wpa_global *global)
Dmitry Shmidte4663042016-04-04 10:07:49 -070034{
35 struct wpas_binder_priv *priv;
36 wpa_supplicant_binder::BinderManager *binder_manager;
37
Dmitry Shmidt7f2c7532016-08-15 09:48:12 -070038 priv = (wpas_binder_priv *)os_zalloc(sizeof(*priv));
Dmitry Shmidte4663042016-04-04 10:07:49 -070039 if (!priv)
40 return NULL;
41 priv->global = global;
42
Roshan Pius54e763a2016-07-06 15:41:53 -070043 wpa_printf(MSG_DEBUG, "Initing binder control");
44
Dmitry Shmidte4663042016-04-04 10:07:49 -070045 android::ProcessState::self()->setThreadPoolMaxThreadCount(0);
46 android::IPCThreadState::self()->disableBackgroundScheduling(true);
47 android::IPCThreadState::self()->setupPolling(&priv->binder_fd);
Dmitry Shmidte4663042016-04-04 10:07:49 -070048 if (priv->binder_fd < 0)
49 goto err;
Roshan Pius54e763a2016-07-06 15:41:53 -070050
51 wpa_printf(
52 MSG_INFO, "Processing binder events on FD %d", priv->binder_fd);
Dmitry Shmidte4663042016-04-04 10:07:49 -070053 /* Look for read events from the binder socket in the eloop. */
Dmitry Shmidt7f2c7532016-08-15 09:48:12 -070054 if (eloop_register_read_sock(
55 priv->binder_fd, wpas_binder_sock_handler, global, priv) < 0)
Dmitry Shmidte4663042016-04-04 10:07:49 -070056 goto err;
57
58 binder_manager = wpa_supplicant_binder::BinderManager::getInstance();
59 if (!binder_manager)
60 goto err;
61 binder_manager->registerBinderService(global);
62 /* We may not need to store this binder manager reference in the
63 * global data strucure because we've made it a singleton class. */
Dmitry Shmidt7f2c7532016-08-15 09:48:12 -070064 priv->binder_manager = (void *)binder_manager;
Dmitry Shmidte4663042016-04-04 10:07:49 -070065
66 return priv;
Dmitry Shmidte4663042016-04-04 10:07:49 -070067err:
68 wpas_binder_deinit(priv);
69 return NULL;
70}
71
Dmitry Shmidte4663042016-04-04 10:07:49 -070072void wpas_binder_deinit(struct wpas_binder_priv *priv)
73{
74 if (!priv)
75 return;
76
Roshan Pius54e763a2016-07-06 15:41:53 -070077 wpa_printf(MSG_DEBUG, "Deiniting binder control");
78
Dmitry Shmidte4663042016-04-04 10:07:49 -070079 wpa_supplicant_binder::BinderManager::destroyInstance();
80 eloop_unregister_read_sock(priv->binder_fd);
81 android::IPCThreadState::shutdown();
Roshan Piusac9845a2016-08-04 09:56:34 -070082 os_free(priv);
Dmitry Shmidte4663042016-04-04 10:07:49 -070083}
84
Dmitry Shmidte4663042016-04-04 10:07:49 -070085int wpas_binder_register_interface(struct wpa_supplicant *wpa_s)
86{
Roshan Piuse8d0d162016-08-01 13:09:26 -070087 if (!wpa_s || !wpa_s->global->binder)
Dmitry Shmidte4663042016-04-04 10:07:49 -070088 return 1;
89
Roshan Pius54e763a2016-07-06 15:41:53 -070090 wpa_printf(
91 MSG_DEBUG, "Registering interface to binder control: %s",
92 wpa_s->ifname);
93
Dmitry Shmidte4663042016-04-04 10:07:49 -070094 wpa_supplicant_binder::BinderManager *binder_manager =
Dmitry Shmidt7f2c7532016-08-15 09:48:12 -070095 wpa_supplicant_binder::BinderManager::getInstance();
Dmitry Shmidte4663042016-04-04 10:07:49 -070096 if (!binder_manager)
97 return 1;
98
99 return binder_manager->registerInterface(wpa_s);
100}
101
Dmitry Shmidte4663042016-04-04 10:07:49 -0700102int wpas_binder_unregister_interface(struct wpa_supplicant *wpa_s)
103{
Roshan Piuse8d0d162016-08-01 13:09:26 -0700104 if (!wpa_s || !wpa_s->global->binder)
Dmitry Shmidte4663042016-04-04 10:07:49 -0700105 return 1;
106
Roshan Pius54e763a2016-07-06 15:41:53 -0700107 wpa_printf(
108 MSG_DEBUG, "Deregistering interface from binder control: %s",
109 wpa_s->ifname);
110
Dmitry Shmidte4663042016-04-04 10:07:49 -0700111 wpa_supplicant_binder::BinderManager *binder_manager =
Dmitry Shmidt7f2c7532016-08-15 09:48:12 -0700112 wpa_supplicant_binder::BinderManager::getInstance();
Dmitry Shmidte4663042016-04-04 10:07:49 -0700113 if (!binder_manager)
114 return 1;
115
116 return binder_manager->unregisterInterface(wpa_s);
117}
Roshan Piusd3854452016-07-07 16:46:41 -0700118
119int wpas_binder_register_network(
120 struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
121{
Roshan Piuse8d0d162016-08-01 13:09:26 -0700122 if (!wpa_s || !wpa_s->global->binder || !ssid)
Roshan Piusd3854452016-07-07 16:46:41 -0700123 return 1;
124
125 wpa_printf(
126 MSG_DEBUG, "Registering network to binder control: %d", ssid->id);
127
128 wpa_supplicant_binder::BinderManager *binder_manager =
129 wpa_supplicant_binder::BinderManager::getInstance();
130 if (!binder_manager)
131 return 1;
132
133 return binder_manager->registerNetwork(wpa_s, ssid);
134}
135
136int wpas_binder_unregister_network(
137 struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
138{
Roshan Piuse8d0d162016-08-01 13:09:26 -0700139 if (!wpa_s || !wpa_s->global->binder || !ssid)
Roshan Piusd3854452016-07-07 16:46:41 -0700140 return 1;
141
142 wpa_printf(
143 MSG_DEBUG, "Deregistering network from binder control: %d",
144 ssid->id);
145
146 wpa_supplicant_binder::BinderManager *binder_manager =
147 wpa_supplicant_binder::BinderManager::getInstance();
148 if (!binder_manager)
149 return 1;
150
151 return binder_manager->unregisterNetwork(wpa_s, ssid);
152}
Roshan Piuse8d0d162016-08-01 13:09:26 -0700153
154int wpas_binder_notify_state_changed(struct wpa_supplicant *wpa_s)
155{
Roshan Piusac9845a2016-08-04 09:56:34 -0700156 if (!wpa_s || !wpa_s->global->binder)
Roshan Piuse8d0d162016-08-01 13:09:26 -0700157 return 1;
158
159 wpa_printf(
160 MSG_DEBUG, "Notifying state change event to binder control: %d",
161 wpa_s->wpa_state);
162
163 wpa_supplicant_binder::BinderManager *binder_manager =
164 wpa_supplicant_binder::BinderManager::getInstance();
165 if (!binder_manager)
166 return 1;
167
168 return binder_manager->notifyStateChange(wpa_s);
169}
Roshan Pius65628ce2016-08-17 13:10:23 -0700170
171int wpas_binder_notify_network_request(
172 struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid,
173 enum wpa_ctrl_req_type rtype, const char *default_txt)
174{
175 if (!wpa_s || !wpa_s->global->binder || !ssid)
176 return 1;
177
178 wpa_printf(
179 MSG_DEBUG, "Notifying network request to binder control: %d",
180 ssid->id);
181
182 wpa_supplicant_binder::BinderManager *binder_manager =
183 wpa_supplicant_binder::BinderManager::getInstance();
184 if (!binder_manager)
185 return 1;
186
187 return binder_manager->notifyNetworkRequest(
188 wpa_s, ssid, rtype, default_txt);
189}