blob: 27e8dedca44a1e9d3cf91cffda02fcb4b4599e02 [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/IServiceManager.h>
11
Dmitry Shmidt7f2c7532016-08-15 09:48:12 -070012#include "binder_constants.h"
Dmitry Shmidte4663042016-04-04 10:07:49 -070013#include "binder_manager.h"
14
15extern "C" {
Dmitry Shmidte4663042016-04-04 10:07:49 -070016#include "utils/common.h"
Dmitry Shmidt7f2c7532016-08-15 09:48:12 -070017#include "utils/includes.h"
Dmitry Shmidte4663042016-04-04 10:07:49 -070018}
19
20namespace wpa_supplicant_binder {
21
Dmitry Shmidte4663042016-04-04 10:07:49 -070022BinderManager *BinderManager::instance_ = NULL;
23
Dmitry Shmidt7f2c7532016-08-15 09:48:12 -070024BinderManager *BinderManager::getInstance()
Dmitry Shmidte4663042016-04-04 10:07:49 -070025{
26 if (!instance_)
27 instance_ = new BinderManager();
28 return instance_;
29}
30
Dmitry Shmidte4663042016-04-04 10:07:49 -070031void BinderManager::destroyInstance()
32{
33 if (instance_)
34 delete instance_;
35 instance_ = NULL;
36}
37
Dmitry Shmidte4663042016-04-04 10:07:49 -070038int BinderManager::registerBinderService(struct wpa_global *global)
39{
40 /* Create the main binder service object and register with
41 * system service manager. */
42 supplicant_object_ = new Supplicant(global);
Dmitry Shmidt7f2c7532016-08-15 09:48:12 -070043 android::String16 service_name(binder_constants::kServiceName);
Dmitry Shmidte4663042016-04-04 10:07:49 -070044 android::defaultServiceManager()->addService(
Dmitry Shmidt7f2c7532016-08-15 09:48:12 -070045 service_name, android::IInterface::asBinder(supplicant_object_));
Dmitry Shmidte4663042016-04-04 10:07:49 -070046 return 0;
47}
48
Dmitry Shmidte4663042016-04-04 10:07:49 -070049int BinderManager::registerInterface(struct wpa_supplicant *wpa_s)
50{
51 if (!wpa_s)
52 return 1;
53
54 /* Using the corresponding wpa_supplicant pointer as key to our
55 * object map. */
56 const void *iface_key = wpa_s;
57
58 /* Return failure if we already have an object for that iface_key. */
59 if (iface_object_map_.find(iface_key) != iface_object_map_.end())
60 return 1;
61
62 iface_object_map_[iface_key] = new Iface(wpa_s);
63 if (!iface_object_map_[iface_key].get())
64 return 1;
65
66 wpa_s->binder_object_key = iface_key;
67
68 return 0;
69}
70
Dmitry Shmidte4663042016-04-04 10:07:49 -070071int BinderManager::unregisterInterface(struct wpa_supplicant *wpa_s)
72{
73 if (!wpa_s || !wpa_s->binder_object_key)
74 return 1;
75
76 const void *iface_key = wpa_s;
77 if (iface_object_map_.find(iface_key) == iface_object_map_.end())
78 return 1;
79
80 /* Delete the corresponding iface object from our map. */
81 iface_object_map_.erase(iface_key);
82 wpa_s->binder_object_key = NULL;
83 return 0;
84}
85
Dmitry Shmidte4663042016-04-04 10:07:49 -070086int BinderManager::getIfaceBinderObjectByKey(
Dmitry Shmidt7f2c7532016-08-15 09:48:12 -070087 const void *iface_object_key,
88 android::sp<fi::w1::wpa_supplicant::IIface> *iface_object)
Dmitry Shmidte4663042016-04-04 10:07:49 -070089{
90 if (!iface_object_key || !iface_object)
91 return 1;
92
93 if (iface_object_map_.find(iface_object_key) == iface_object_map_.end())
94 return 1;
95
96 *iface_object = iface_object_map_[iface_object_key];
97 return 0;
98}
99
100} /* namespace wpa_supplicant_binder */