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