1a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan//
2a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan// Copyright (C) 2016 The Android Open Source Project
3a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan//
4a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan// Licensed under the Apache License, Version 2.0 (the "License");
5a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan// you may not use this file except in compliance with the License.
6a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan// You may obtain a copy of the License at
7a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan//
8a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan//      http://www.apache.org/licenses/LICENSE-2.0
9a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan//
10a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan// Unless required by applicable law or agreed to in writing, software
11a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan// distributed under the License is distributed on an "AS IS" BASIS,
12a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan// See the License for the specific language governing permissions and
14a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan// limitations under the License.
15a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan//
16a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
17a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#include "shill/binder/binder_control.h"
18a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
19a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#include <base/bind.h>
20a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#include <binder/IServiceManager.h>
21b857a0f3b0cab7f2ba61fd9ac2235555c7098243Samuel Tan#include <binderwrapper/binder_wrapper.h>
22a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#include <brillo/binder_watcher.h>
23a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
24a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan// TODO(samueltan): remove when shill is no longer dependent on DBus proxies.
25a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#include <dbus/service_constants.h>
26a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
27a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#include "shill/manager.h"
28a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
29a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#include "shill/binder/device_binder_adaptor.h"
30a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#include "shill/binder/manager_binder_adaptor.h"
31a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#include "shill/binder/service_binder_adaptor.h"
32a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#include "shill/dbus/chromeos_dhcpcd_listener.h"
33a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#include "shill/dbus/chromeos_dhcpcd_proxy.h"
34a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#include "shill/ipconfig_adaptor_stub.h"
35a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#include "shill/profile_adaptor_stub.h"
36a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#include "shill/rpc_task_adaptor_stub.h"
37a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#include "shill/third_party_vpn_adaptor_stub.h"
38a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#include "shill/dbus/chromeos_firewalld_proxy.h"
39a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#include "shill/power_manager_proxy_stub.h"
40a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#include "shill/upstart/upstart_proxy_stub.h"
41a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#if !defined(DISABLE_WIFI)
42a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#include "shill/dbus/chromeos_supplicant_bss_proxy.h"
43a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#endif  // DISABLE_WIFI
44a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#if !defined(DISABLE_WIFI) || !defined(DISABLE_WIRED_8021X)
45a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#include "shill/dbus/chromeos_supplicant_interface_proxy.h"
46a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#include "shill/dbus/chromeos_supplicant_network_proxy.h"
47a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#include "shill/dbus/chromeos_supplicant_process_proxy.h"
48a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#endif  // DISABLE_WIFI || DISABLE_WIRED_8021X
49a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
50b857a0f3b0cab7f2ba61fd9ac2235555c7098243Samuel Tanusing android::BinderWrapper;
51a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tanusing android::defaultServiceManager;
52a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tanusing std::string;
53a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tanusing std::to_string;
54a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
55a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tannamespace shill {
56a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
57a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan// static.
58a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tanconst char BinderControl::kNullRpcIdentifier[] = "-1";
59a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
60a04c6448da585d8bef65b8bbd44711fd7882c917Samuel TanBinderControl::BinderControl(EventDispatcher* dispatcher)
61a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan    : next_unique_binder_adaptor_id_(0),
62a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan      dispatcher_(dispatcher),
63a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan      null_identifier_(kNullRpcIdentifier) {
64b857a0f3b0cab7f2ba61fd9ac2235555c7098243Samuel Tan  BinderWrapper::Create();
65a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  // Watch Binder events in the main loop
66a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  brillo::BinderWatcher binder_watcher;
67a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  CHECK(binder_watcher.Init()) << "Binder FD watcher init failed";
68a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
69a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  // Also initialize D-Bus, which we will use alongside Binder for IPC with
70a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  // daemons that do not yet support Binder.
71a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  // TODO(samueltan): remove when shill is no longer dependent on DBus proxies.
72a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  dbus::Bus::Options options;
73a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  options.bus_type = dbus::Bus::SYSTEM;
74a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  proxy_bus_ = new dbus::Bus(options);
75a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  CHECK(proxy_bus_->Connect());
76a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan}
77a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
78a04c6448da585d8bef65b8bbd44711fd7882c917Samuel TanBinderControl::~BinderControl() {
79a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  // TODO(samueltan): remove when shill is no longer dependent on DBus proxies.
80a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  if (proxy_bus_) {
81a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan    proxy_bus_->ShutdownAndBlock();
82a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  }
83a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan}
84a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
85a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tanconst string& BinderControl::NullRPCIdentifier() { return null_identifier_; }
86a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
87a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tanvoid BinderControl::RegisterManagerObject(
88a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan    Manager* manager, const base::Closure& registration_done_callback) {
89a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  // Binder manager object registration is performed synchronously, and
90a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  // ManagerBinderAdaptor::RegisterAsync does not
91a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  // actually use the callback passed to it. However, since the caller of this
92a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  // function expects |registration_done_callback| to be called asynchronously,
93a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  // post the callback to the message loop ourselves.
94a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  manager->RegisterAsync(base::Callback<void(bool)>());
95a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  dispatcher_->PostTask(registration_done_callback);
96a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan}
97a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
98a04c6448da585d8bef65b8bbd44711fd7882c917Samuel TanDeviceAdaptorInterface* BinderControl::CreateDeviceAdaptor(Device* device) {
99a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  return CreateAdaptor<Device, DeviceAdaptorInterface, DeviceBinderAdaptor>(
100a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan      device);
101a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan}
102a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
103a04c6448da585d8bef65b8bbd44711fd7882c917Samuel TanIPConfigAdaptorInterface* BinderControl::CreateIPConfigAdaptor(
104a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan    IPConfig* config) {
105a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  return new IPConfigAdaptorStub(to_string(next_unique_binder_adaptor_id_++));
106a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan}
107a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
108a04c6448da585d8bef65b8bbd44711fd7882c917Samuel TanManagerAdaptorInterface* BinderControl::CreateManagerAdaptor(Manager* manager) {
109a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  return CreateAdaptor<Manager, ManagerAdaptorInterface, ManagerBinderAdaptor>(
110a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan      manager);
111a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan}
112a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
113a04c6448da585d8bef65b8bbd44711fd7882c917Samuel TanProfileAdaptorInterface* BinderControl::CreateProfileAdaptor(Profile* profile) {
114a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  return new ProfileAdaptorStub(to_string(next_unique_binder_adaptor_id_++));
115a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan}
116a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
117a04c6448da585d8bef65b8bbd44711fd7882c917Samuel TanRPCTaskAdaptorInterface* BinderControl::CreateRPCTaskAdaptor(RPCTask* task) {
118a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  return new RPCTaskAdaptorStub(to_string(next_unique_binder_adaptor_id_++));
119a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan}
120a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
121a04c6448da585d8bef65b8bbd44711fd7882c917Samuel TanServiceAdaptorInterface* BinderControl::CreateServiceAdaptor(Service* service) {
122a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  return CreateAdaptor<Service, ServiceAdaptorInterface, ServiceBinderAdaptor>(
123a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan      service);
124a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan}
125a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
126a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#ifndef DISABLE_VPN
127a04c6448da585d8bef65b8bbd44711fd7882c917Samuel TanThirdPartyVpnAdaptorInterface* BinderControl::CreateThirdPartyVpnAdaptor(
128a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan    ThirdPartyVpnDriver* driver) {
129a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  return new ThirdPartyVpnAdaptorStub(
130a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan      to_string(next_unique_binder_adaptor_id_++));
131a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan}
132a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#endif
133a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
134a04c6448da585d8bef65b8bbd44711fd7882c917Samuel TanPowerManagerProxyInterface* BinderControl::CreatePowerManagerProxy(
135a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan    PowerManagerProxyDelegate* delegate,
136a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan    const base::Closure& service_appeared_callback,
137a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan    const base::Closure& service_vanished_callback) {
138a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  return new PowerManagerProxyStub();
139a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan}
140a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
141a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#if !defined(DISABLE_WIFI) || !defined(DISABLE_WIRED_8021X)
142a04c6448da585d8bef65b8bbd44711fd7882c917Samuel TanSupplicantProcessProxyInterface* BinderControl::CreateSupplicantProcessProxy(
143a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan    const base::Closure& service_appeared_callback,
144a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan    const base::Closure& service_vanished_callback) {
145a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  return new ChromeosSupplicantProcessProxy(dispatcher_, proxy_bus_,
146a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan                                            service_appeared_callback,
147a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan                                            service_vanished_callback);
148a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan}
149a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
150a04c6448da585d8bef65b8bbd44711fd7882c917Samuel TanSupplicantInterfaceProxyInterface*
151a04c6448da585d8bef65b8bbd44711fd7882c917Samuel TanBinderControl::CreateSupplicantInterfaceProxy(
152a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan    SupplicantEventDelegateInterface* delegate, const string& object_path) {
153a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  return new ChromeosSupplicantInterfaceProxy(proxy_bus_, object_path,
154a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan                                              delegate);
155a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan}
156a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
157a04c6448da585d8bef65b8bbd44711fd7882c917Samuel TanSupplicantNetworkProxyInterface* BinderControl::CreateSupplicantNetworkProxy(
158a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan    const string& object_path) {
159a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  return new ChromeosSupplicantNetworkProxy(proxy_bus_, object_path);
160a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan}
161a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#endif  // DISABLE_WIFI || DISABLE_WIRED_8021X
162a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
163a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#if !defined(DISABLE_WIFI)
164a04c6448da585d8bef65b8bbd44711fd7882c917Samuel TanSupplicantBSSProxyInterface* BinderControl::CreateSupplicantBSSProxy(
165a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan    WiFiEndpoint* wifi_endpoint, const string& object_path) {
166a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  return new ChromeosSupplicantBSSProxy(proxy_bus_, object_path, wifi_endpoint);
167a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan}
168a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan#endif  // DISABLE_WIFI
169a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
170a04c6448da585d8bef65b8bbd44711fd7882c917Samuel TanDHCPCDListenerInterface* BinderControl::CreateDHCPCDListener(
171a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan    DHCPProvider* provider) {
172a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  return new ChromeosDHCPCDListener(proxy_bus_, dispatcher_, provider);
173a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan}
174a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
175a04c6448da585d8bef65b8bbd44711fd7882c917Samuel TanDHCPProxyInterface* BinderControl::CreateDHCPProxy(const string& service) {
176a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  return new ChromeosDHCPCDProxy(proxy_bus_, service);
177a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan}
178a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
179a04c6448da585d8bef65b8bbd44711fd7882c917Samuel TanUpstartProxyInterface* BinderControl::CreateUpstartProxy() {
180a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  return new UpstartProxyStub();
181a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan}
182a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
183a04c6448da585d8bef65b8bbd44711fd7882c917Samuel TanFirewallProxyInterface* BinderControl::CreateFirewallProxy() {
184a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  return new ChromeosFirewalldProxy(proxy_bus_);
185a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan}
186a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
187a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tantemplate <typename Object, typename AdaptorInterface, typename Adaptor>
188a04c6448da585d8bef65b8bbd44711fd7882c917Samuel TanAdaptorInterface* BinderControl::CreateAdaptor(Object* object) {
189a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan  return new Adaptor(object, to_string(next_unique_binder_adaptor_id_++));
190a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan}
191a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan
192a04c6448da585d8bef65b8bbd44711fd7882c917Samuel Tan}  // namespace shill
193